mid 1.2.0

Creating a unique machine ID hash for MacOS/Linux/Windows
Documentation
<a href="https://crates.io/crates/mid"><img src="https://img.shields.io/crates/v/mid?style=for-the-badge&logo=rust&color=orange" /></a>
<a href="https://docs.rs/mid/latest/mid/">
<img src="https://img.shields.io/badge/docs-latest-blue.svg?style=for-the-badge&logo=rust&color=blue"
      alt="docs.rs docs" />
</a>

## MachineID для Rust

Создание уникального хэша идентификатора устройства для MacOS/Linux/Windows.

Отличное решение для лицензирования ваших программ, которое использует максимально статичные и в основном неизменяемые данные.

Далее, ознакомьтесь с параметрами, которые мы используем на каждой из платформ.

### MacOS

```bash
system_profiler SPHardwareDataType
```

[Команда](https://ss64.com/osx/system_profiler.html) возвращает информацию о аппаратных характеристиках компьютера. Используемые параметры:

- **Model Number**: Этот параметр представляет собой номер модели компьютера или устройства. Он используется для уникальной идентификации конкретной модели в рамках производителя.

- **Serial Number**: Этот параметр является уникальным серийным номером компьютера или устройства. Он используется для идентификации конкретной единицы в рамках определенной модели.

- **Hardware UUID**: Этот параметр представляет уникальный идентификатор аппаратного обеспечения (UUID) компьютера или устройства. Он служит для обеспечения уникальной идентификации конкретной единицы в различных системах и средах.

- **Provisioning UDID**: Этот параметр представляет уникальный идентификатор устройства (UDID), который может использоваться в процессе предоставления или настройки устройства, обычно в корпоративной или управляемой среде.

```bash
system_profiler SPSecureElementDataType
```

Команда возвращает информацию о безопасном элементе (Secure Element). Этот элемент используется для хранения зашифрованных данных, таких как информация о платежных картах и другие конфиденциальные данные. Используемые параметры:

- **Platform ID**: Уникальный идентификатор платформы, к которой относится Secure Element (безопасный элемент).
- **SEID**: Уникальный идентификатор безопасного элемента (Secure Element ID). Создается при прошивки NFC чипа на заводе производителя.

### Linux

- `cat /etc/machine-id`: Возвращает идентификатор (ID) машины, который используется для уникальной идентификации компьютера в Linux системах. **К сожалению, этот параметр подвержен изменениям, и пока не найдено надежного решения для Linux**.

### Windows

[WMIC](https://ss64.com/nt/wmic.html) - Windows Management Instrumentation Command.

> Инструмент WMIC [устарел](https://arc.net/l/quote/zgcodjij) в Windows 10, версии 21H1 и полугодовом канальном выпуске 21H1 для Windows Server.

Теперь все команды вызываются через PowerShell.

- ~~wmic csproduct get UUID~~ `powershell -command "Get-WmiObject Win32_ComputerSystemProduct"`: Возвращает уникальный идентификатор (UUID) продукта компьютера. Обычно связан с материнской платой компьютера. В редких случаях он может измениться после замены или переустановки материнской платы или после изменения BIOS/UEFI на устройстве.

- ~~wmic bios get serialnumber~~ `powershell -command "Get-WmiObject Win32_BIOS"`: Возвращает серийный номер BIOS компьютера. Обычно остается постоянным и не подлежит изменению.

- ~~wmic path win32_baseboard get serialnumber~~ `powershell -command "Get-WmiObject Win32_BaseBoard"`: Возвращает серийный номер базовой платы компьютера. Обычно остается постоянным и не подлежит изменению.

- ~~wmic cpu get processorid~~ `powershell -command "Get-WmiObject Win32_Processor"`: Возвращает идентификатор процессора компьютера. Должен оставаться неизменным, за исключением случаев замены процессора.

## Как установить

Добавить зависимость в Cargo.toml

```toml
[dependencies]
mid = "1.2.0"
```

Или установить с помощью Cargo CLI

```bash
cargo add mid
```

## Как использовать

Максимально просто

```rust
let machine_id = mid::get("mySecretKey").unwrap();
```

Использование в функции с обработкой ошибки

```rust
fn get_machine_id() -> Result<String, String> {
    match mid::get("mySecretKey") {
        Ok(mid) => Ok(mid),
        Err(err) => {
            println!("MID error: {}", err.to_string());
            Err(err.to_string())
        }
    }
}
```

Так же можно вывести в консоль MID result/hash

- `MID result` - массив параметров OS
- `MID hash` - хеш SHA-256 от result

```rust
mid::print("mySecretKey");
```

### Подписывайтесь на мой Х

Здесь я буду делиться своими разработками и проектами
https://x.com/doroved

### Ссылки

- [machineid-rs](https://github.com/Taptiive/machineid-rs)
- [machine_uuid](https://github.com/choicesourcing/machine_uuid)
- [rust-machine-id](https://github.com/mathstuf/rust-machine-id)
- [app-machine-id](https://github.com/d-k-bo/app-machine-id)