doroved / mid

Creating a Machine ID hash for MacOS/Windows/Linux
https://crates.io/crates/mid
27 stars 1 forks source link

Парочка изменений #1

Closed michitta closed 7 months ago

michitta commented 8 months ago

Здравствуйте! Мне очень понравился Ваш проект. Во время внедрения в своё приложение, я пересмотрел некоторые реализованные Вами способы для большей оптимизации и уменьшения размера итогового приложения.

Вот несколько моих изменений:

1) Для windows можно использовать библиотеку wmi, которая позволяет быстро и без спавна окон powershell получить необходимые параметры (код указан в качестве примера):

    #[cfg(target_os = "windows")]
    pub fn get_mid_result() -> Result<String, MIDError> {
    use wmi::{COMLibrary, WMIConnection};

    let com_connection = unsafe { COMLibrary::assume_initialized() };
    let wmi_connection =
        WMIConnection::new(com_connection.into()).expect("Failed to connect to WMI");

    let mac_address_base: Vec<MACGeneric> = wmi_connection
        .raw_query("SELECT MACAddress from Win32_NetworkAdapter WHERE MACAddress IS NOT NULL")
        .unwrap();

    let bios_serial_base: Vec<SerialNumberGeneric> = wmi_connection
        .raw_query("SELECT SerialNumber from Win32_BIOS WHERE SerialNumber IS NOT NULL")
        .unwrap();

    let processor_id_base: Vec<ProcessorIdGeneric> = wmi_connection
        .raw_query("SELECT ProcessorId from Win32_Processor WHERE ProcessorId IS NOT NULL")
        .unwrap();

    let mut result = Vec::new();

    parse_and_push(&mac_address_base[0].MACAddress, &mut result);
    parse_and_push(&bios_serial_base[0].SerialNumber, &mut result);
    parse_and_push(&processor_id_base[0].ProcessorId, &mut result);

    if result.is_empty() {
        return Err(MIDError::ResultMidError);
    }

    let combined_string = result.join("|");

    Ok(combined_string)
    }

2) Так как ring очень много весит, я использовал sha2 для генерации уникального идентификатора ПК. Это позволило сильно уменьшить размер приложения.

doroved commented 8 months ago

Здравствуйте! Мне очень понравился Ваш проект. Во время внедрения в своё приложение, я пересмотрел некоторые реализованные Вами способы для большей оптимизации и уменьшения размера итогового приложения.

Вот несколько моих изменений:

  1. Для windows можно использовать библиотеку wmi, которая позволяет быстро и без спавна окон powershell получить необходимые параметры (код указан в качестве примера):
    #[cfg(target_os = "windows")]
    pub fn get_mid_result() -> Result<String, MIDError> {
    use wmi::{COMLibrary, WMIConnection};

    let com_connection = unsafe { COMLibrary::assume_initialized() };
    let wmi_connection =
        WMIConnection::new(com_connection.into()).expect("Failed to connect to WMI");

    let mac_address_base: Vec<MACGeneric> = wmi_connection
        .raw_query("SELECT MACAddress from Win32_NetworkAdapter WHERE MACAddress IS NOT NULL")
        .unwrap();

    let bios_serial_base: Vec<SerialNumberGeneric> = wmi_connection
        .raw_query("SELECT SerialNumber from Win32_BIOS WHERE SerialNumber IS NOT NULL")
        .unwrap();

    let processor_id_base: Vec<ProcessorIdGeneric> = wmi_connection
        .raw_query("SELECT ProcessorId from Win32_Processor WHERE ProcessorId IS NOT NULL")
        .unwrap();

    let mut result = Vec::new();

    parse_and_push(&mac_address_base[0].MACAddress, &mut result);
    parse_and_push(&bios_serial_base[0].SerialNumber, &mut result);
    parse_and_push(&processor_id_base[0].ProcessorId, &mut result);

    if result.is_empty() {
        return Err(MIDError::ResultMidError);
    }

    let combined_string = result.join("|");

    Ok(combined_string)
    }
  1. Так как ring очень много весит, я использовал sha2 для генерации уникального идентификатора ПК. Это позволило сильно уменьшить размер приложения.

Привет, спасибо)

  1. Изначально было сделано через WMIC, но оно оказалось Deprecated, поэтому переделал на Powershell, т.к. он есть на каждой машине.
  2. Действительно, не обратил внимание на размер ring, попробую заменить на hmac и sha2
michitta commented 8 months ago

Здравствуйте! Мне очень понравился Ваш проект. Во время внедрения в своё приложение, я пересмотрел некоторые реализованные Вами способы для большей оптимизации и уменьшения размера итогового приложения. Вот несколько моих изменений:

  1. Для windows можно использовать библиотеку wmi, которая позволяет быстро и без спавна окон powershell получить необходимые параметры (код указан в качестве примера):
    #[cfg(target_os = "windows")]
    pub fn get_mid_result() -> Result<String, MIDError> {
    use wmi::{COMLibrary, WMIConnection};

    let com_connection = unsafe { COMLibrary::assume_initialized() };
    let wmi_connection =
        WMIConnection::new(com_connection.into()).expect("Failed to connect to WMI");

    let mac_address_base: Vec<MACGeneric> = wmi_connection
        .raw_query("SELECT MACAddress from Win32_NetworkAdapter WHERE MACAddress IS NOT NULL")
        .unwrap();

    let bios_serial_base: Vec<SerialNumberGeneric> = wmi_connection
        .raw_query("SELECT SerialNumber from Win32_BIOS WHERE SerialNumber IS NOT NULL")
        .unwrap();

    let processor_id_base: Vec<ProcessorIdGeneric> = wmi_connection
        .raw_query("SELECT ProcessorId from Win32_Processor WHERE ProcessorId IS NOT NULL")
        .unwrap();

    let mut result = Vec::new();

    parse_and_push(&mac_address_base[0].MACAddress, &mut result);
    parse_and_push(&bios_serial_base[0].SerialNumber, &mut result);
    parse_and_push(&processor_id_base[0].ProcessorId, &mut result);

    if result.is_empty() {
        return Err(MIDError::ResultMidError);
    }

    let combined_string = result.join("|");

    Ok(combined_string)
    }
  1. Так как ring очень много весит, я использовал sha2 для генерации уникального идентификатора ПК. Это позволило сильно уменьшить размер приложения.

Привет, спасибо)

  1. Изначально было сделано через WMIC, но оно оказалось Deprecated, поэтому переделал на Powershell, т.к. он есть на каждой машине.
  2. Действительно, не обратил внимание на размер ring, попробую заменить на hmac и sha2

Так это WMI, а не WMIC image

doroved commented 8 months ago

Так это WMI, а не WMIC

Я как не виндовс юзеров, не шарю за это) Насколько критично использование Powershell? И это именно на винде? Потому что на макос тоже используется std::process::Command

michitta commented 8 months ago

Так это WMI, а не WMIC

Я как не виндовс юзеров, не шарю за это) Насколько критично использование Powershell? И это именно на винде? Потому что на макос тоже используется std::process::Command

На windows во время получения появляется 4 окна powershell )

doroved commented 8 months ago

На windows во время получения появляется 4 окна powershell )

Прикол) А попробуй добавить этот момент во всех команды винды, в исходники установленного пакета у себя. Если сработает, то добавлю и залью обнову.

image
let csproduct_output = run_shell_comand(
    "powershell",
    [
        "-WindowStyle",
        "Hidden",
        "-command",
        r#"Get-WmiObject Win32_ComputerSystemProduct | Select-Object -ExpandProperty UUID"#,
    ],
)
.unwrap_or("".into());

Тут до сих пор открыто issue, но пишут, что обязательно сначала -WindowStyle в команде должно идти https://github.com/PowerShell/PowerShell/issues/3028#issuecomment-1812664134

michitta commented 8 months ago

На windows во время получения появляется 4 окна powershell )

Прикол) А попробуй добавить этот момент во всех команды винды, в исходники установленного пакета у себя. Если сработает, то добавлю и залью обнову. image

let csproduct_output = run_shell_comand(
    "powershell",
    [
        "-WindowStyle",
        "Hidden",
        "-command",
        r#"Get-WmiObject Win32_ComputerSystemProduct | Select-Object -ExpandProperty UUID"#,
    ],
)
.unwrap_or("".into());

Тут до сих пор открыто issue, но пишут, что обязательно сначала -WindowStyle в команде должно идти PowerShell/PowerShell#3028 (comment)

image Запустил в таком виде, консоль не появилась

doroved commented 8 months ago

Запустил в таком виде, консоль не появилась

Отлично, а проверь, данные отдает такая команда? Если да, то поправлю и обновлю сегодня

michitta commented 8 months ago

Запустил в таком виде, консоль не появилась

Отлично, а проверь, данные отдает такая команда? Если да, то поправлю и обновлю сегодня

Отдаёт

doroved commented 8 months ago

Отдаёт

Готово, оптимизировал зависимости и добавил WindowStyle Hidden Версия 1.1.2 Проверь у себя и скажи, все ли ок)

michitta commented 8 months ago

Отдаёт

Готово, оптимизировал зависимости и добавил WindowStyle Hidden Версия 1.1.2 Проверь у себя и скажи, все ли ок)

Всё работает, но всё-равно очень медленно. Минимальное время полученное в ходе 3 запусков приложения: 2.89s.

doroved commented 7 months ago

но всё-равно очень медленно. Минимальное время полученное в ходе 3 запусков приложения: 2.89s.

Наверное надо будет асинхронно вызывать команды powershell, чтобы ускорить

doroved commented 7 months ago

@michitta

Загрузи крейт к себе на пк, замени код в windows.rs на этот и потести скорость плз)

#[cfg(target_os = "windows")]
use crate::errors::MIDError;

#[cfg(target_os = "windows")]
use crate::utils::run_shell_comand;

#[cfg(target_os = "windows")]
pub(crate) fn get_mid_result() -> Result<String, MIDError> {
    let combined_output = run_shell_comand(
        "powershell",
        [
            "-WindowStyle",
            "Hidden",
            "-command",
            r#"
            $csproduct = Get-WmiObject Win32_ComputerSystemProduct | Select-Object -ExpandProperty UUID;
            $bios = Get-WmiObject Win32_BIOS | Select-Object -ExpandProperty SerialNumber;
            $baseboard = Get-WmiObject Win32_BaseBoard | Select-Object -ExpandProperty SerialNumber;
            $cpu = Get-WmiObject Win32_Processor | Select-Object -ExpandProperty ProcessorId;
            "$csproduct|$bios|$baseboard|$cpu"
            "#,
            ],
    )
    .unwrap_or("".into());

    if combined_output.is_empty() {
        return Err(MIDError::ResultMidError);
    }

    let combined_string = combined_output
        .trim()
        .trim_start_matches('|')
        .trim_end_matches('|');

    Ok(combined_string.to_string())
}

И да, перед этим сними mid текущей версии и сравни его с тем, что получится с этим кодом, должно совпасть.

doroved commented 7 months ago

Всё работает, но всё-равно очень медленно. Минимальное время полученное в ходе 3 запусков приложения: 2.89s.

Если нужно часто дергать mid, то например, имеет смысл сохранять его в state

michitta commented 7 months ago

Извиняюсь за долгий ответ. Hwid я записывал в sessionStorage. Сейчас я отказался от получения hwid из-за проблем с уникальностью получаемого hwid. На Linux и macos может и сработает подобный вариант получения hwid (который у Вас в crate), но на windows постоянно попадаются повторения получаемого hwid.

doroved commented 7 months ago

Сейчас я отказался от получения hwid из-за проблем с уникальностью получаемого hwid

Проблемы с уникальностью в целом на windows или в текущем крейте?

На Linux и macos может и сработает

На Linux практически нет надежных вариантов, она вся секьюрная, самый идеальный вариант для macos.

но на windows постоянно попадаются повторения получаемого hwid.

Можно подробней пожалуйста, как вы это отследили, запустили трафик на свое приложение? Странно, используется 4 не связанных между собой параметра, у разных людей вы заметили одинаковый хеш MID? В любом случае максимально информации хотелось бы, на сколько это возможно, спасибо)

michitta commented 7 months ago

Проблемы с уникальностью в целом на windows. Другие платформы протестировать не было возможности.

Я разрабатываю приватный лаунчер для Minecraft проектов.

На бэке организовал добавление в таблицу к пользователю hwid. В итоге тестирования на аудитории ~10к человек у многих вылетала ошибка, которая гласила, что данный ПК уже привязан к другому аккаунту. Я пробовал и другие параметры использовать для вычисления hwid, но повторения всё равно были.

doroved commented 7 months ago

Проблемы с уникальностью в целом на windows. Другие платформы протестировать не было возможности.

Я разрабатываю приватный лаунчер для Minecraft проектов.

На бэке организовал добавление в таблицу к пользователю hwid. В итоге тестирования на аудитории ~10к человек у многих вылетала ошибка, которая гласила, что данный ПК уже привязан к другому аккаунту. Я пробовал и другие параметры использовать для вычисления hwid, но повторения всё равно были.

А сколько конкретно людей из 10к, можно посчитать? Интересен %.

  1. Проверьте, нет ли ошибок в самой логике определения привязки и отображения подобного уведомления.
  2. Выведите в интерфейс программы хеш MID и попросите тех людей, кто столкнулся с проблемой, прислать вам хеш, который у них отображается, чтобы убедиться, что он действительно один и тот же.
  3. Опросите людей с проблемой, какие у них железки стоят. Очень странно, даже если производитель один и тот же, почему ID одинаковые.
michitta commented 7 months ago

1) В логике нет ошибок

2) У меня логгер на бэке стоял под это дело

3) Железо было разное

michitta commented 7 months ago

У некоторых пользователей были проблемы с получением части параметров. Почему на одной системе все параметры получаются, а на другой нет - для меня загадка

doroved commented 7 months ago

У некоторых пользователей были проблемы с получением части параметров. Почему на одной системе все параметры получаются, а на другой нет - для меня загадка

Да, я только начал про это писать, опередили) Похоже, что часть параметров не определяется и есть какой то 1-2 одинаковых для всех людей с проблемой. Идеально сделать логирование списка параметров, чтобы выявить какие из них не уникальные и дальше можно изучать этот вопрос.

michitta commented 7 months ago

"А сколько конкретно людей из 10к, можно посчитать? Интересен %." - процент подсчитать не смогу.

Ещё хотел добавить, что процессор лучше не использовать для получения hwid. Если разработчик хочет сделать привязку ПК к аккаунту, то значение будет меняться. Я думаю, что стоит идти в сторону получения каких-то данных от материнской платы, чтобы при замене процессора не происходила смена hwid.

michitta commented 7 months ago

В ближайшие дни верну проверку по HWID и отпишусь о результатах более подробно

doroved commented 7 months ago

Если разработчик хочет сделать привязку ПК к аккаунту, то значение будет меняться.

Имейте ввиду, что cpu_output может меняться?

Я думаю, что стоит идти в сторону получения каких-то данных от материнской платы, чтобы при замене процессора не происходила смена hwid.

Проблема в том, что ПК не винде, как конструктор, по идее там можно заменить всё и тогда отпечаток изменится, но надеюсь это не частый случай и в таком случае пользователю просто надо будет перепривязать свой аккаунт на обновленном устройстве.

michitta commented 7 months ago

Если разработчик хочет сделать привязку ПК к аккаунту, то значение будет меняться.

Имейте ввиду, что cpu_output может меняться?

Я думаю, что стоит идти в сторону получения каких-то данных от материнской платы, чтобы при замене процессора не происходила смена hwid.

Проблема в том, что ПК не винде, как конструктор, по идее там можно заменить всё и тогда отпечаток изменится, но надеюсь это не частый случай и в таком случае пользователю просто надо будет перепривязать свой аккаунт на обновленном устройстве.

Подобная защита по HWID защищает только от школьников, посмотревших гайды на ютубе, но когда аудитория состоит только из них - это хорошее решение))) (на винде)

doroved commented 7 months ago

Подобная защита по HWID защищает только от школьников

А как еще иначе лицензировать софт кроме как создания MID?) Поэтому и используются идентификаторы железок, которые программно не подменить, только если железо перебирать, что становится нецелесообразным для тех, кто хочет ваш софт использовать бесплатно (если есть триал версия на каждый уникальный MID)

doroved commented 7 months ago

@michitta а потестируй пожалуйста этот вариант https://github.com/doroved/mid/issues/1#issuecomment-1950998466 И можешь мне в тг написать плз, там удобнее будет (в профиле есть), есть некоторые мысли по пустым показателям некоторых юзеров.

doroved commented 7 months ago

Выпустил версию 1.1.3 с этим кодом, который быстрее чуть больше х2. В следующих версиях рассмотрю использование wmi, т.к. через него еще быстрее будет.

kurdin commented 4 months ago

@doroved использую mid 2.0.0 на Виндах (10 и 11) при каждом запросе к get_mid_result вылезает окно powershell. Похоже что "-WindowStyle" не работает. Может стоит перейти на Command::new("powershell") ?

kurdin commented 4 months ago

@doroved вот я нашел комбинацию которая вроде как не открывает отдельное окно powershell на windows

const CREATE_NO_WINDOW: u32 = 0x08000000;
use std::os::windows::process::CommandExt;
...
let combined_output = Command::new("powershell")
        .args([
            "-WindowStyle",
            "Hidden",
            "-command",
            r#"
            $csproduct = Get-WmiObject Win32_ComputerSystemProduct | Select-Object -ExpandProperty UUID;
            $bios = Get-WmiObject Win32_BIOS | Select-Object -ExpandProperty SerialNumber;
            $baseboard = Get-WmiObject Win32_BaseBoard | Select-Object -ExpandProperty SerialNumber;
            $cpu = Get-WmiObject Win32_Processor | Select-Object -ExpandProperty ProcessorId;
            "$csproduct|$bios|$baseboard|$cpu"
            "#,
        ])
        .creation_flags(CREATE_NO_WINDOW)
        .stderr(Stdio::piped())
        .stdout(Stdio::piped())
        .spawn();

    match combined_output {
      Ok(output) => {
        let output = output.wait_with_output().unwrap();
        if !output.status.success() {
          return Err("Failed to get device ID".to_string());
        }
        let combined_output = String::from_utf8_lossy(&output.stdout);
        if combined_output.is_empty() {
          return Err("Failed to get device ID".to_string());
        }

        println!("Device ID: {}", combined_output.trim());

        Ok(
          combined_output
            .trim()
            .trim_start_matches('|')
            .trim_end_matches('|')
            .to_lowercase(),
        )
      }
      Err(e) => Err(e.to_string()),
    }
doroved commented 4 months ago

@doroved использую mid 2.0.0 на Виндах (10 и 11) при каждом запросе к get_mid_result вылезает окно powershell. Похоже что "-WindowStyle" не работает. Может стоит перейти на Command::new("powershell") ?

Похоже винда у всех "своя" и все работает по разному, вот у человека окно пропало после -WindowStyle https://github.com/doroved/mid/issues/1#issuecomment-1931868503

В след версии я уберу powershell и буду использовать WMI, там практически мгновенно инфа получается + надежнее надеюсь будет)

kurdin commented 4 months ago

@doroved когда планируешь выпустить новую версию ?

doroved commented 4 months ago

@doroved когда планируешь выпустить новую версию ?

может на выходных выделю на это время, чтобы не отвлекаться больше. Я пингану тут, потестим, т.к. я не на винде.

kurdin commented 4 months ago

@doroved Да, напиши я потестирую на Виндах. Спасибо!

doroved commented 4 months ago

@doroved Да, напиши я потестирую на Виндах. Спасибо!

ох, если честно под винду писать на маке это нереально) Я использовал код, которым поделился @michitta , но тесты не проходят через Actions, ошибка коннекта к WMI. https://github.com/doroved/mid/actions/runs/9237189042/job/25413859546#step:4:20

Попробуй потестировать у себя

mid = { git = "https://github.com/doroved/mid", branch = "dev" }

Если заработает, то сверь хеши текущей версии и дев, нужно чтобы совпадали

kurdin commented 4 months ago

@doroved поставь на Маке utm с Windows 11, там все есть для rust development -а https://mac.getutm.app/gallery/windows-11-arm

Я попробую как время будет на Виндах. Я тоже на маке сижу в основном и я Parallel использую для Windows 11 Arm

kurdin commented 4 months ago

@doroved протестирвал на Windows, все работает. Решение использовать WMIConnection правильное. Но, я стал сомневаться в целесообразности комбинации всех этих параметров на компьютере клиента в результате чего получается Machine ID.

result.push(computer_uuid_base[0].UUID.to_string());
result.push(bios_serial_base[0].SerialNumber.to_string());
result.push(baseboard_serial_base[0].SerialNumber.to_string());
result.push(processor_id_base[0].ProcessorId.to_string());

По крайней мере в моем случае, мне нужен уникальный номер машины клиента что положить его в базу вместе с лицензией которую он купит для софта и проверять его при активации этой лицензии. Я не хотел бы чтоб например при обновлении процессора на компьютере у меня получался новый Machine ID поэтому в моем случае мне вполне будет достаточно получения Machine ID только на основе computer_uuid_base. В случае если его не удалось достать, можно проверять уже на bios_serial_base[0].SerialNumber или baseboard_serial_base[0].SerialNumber. Но комбинация всех этих параметров, опять же для моего кейса скорей всего не подходит. Если ты сделаешь опцию по каким параметрам генерить Machine ID то наверное тогда мне будет целесообразно использовать твою либу а так скорей всего мне достаточно сделать запросы на Windows


   let computer_uuid_base: Vec<UUIDGeneric> = wmi_connection
        .raw_query("SELECT UUID from Win32_ComputerSystemProduct WHERE UUID IS NOT NULL")
        .unwrap();

и на Маке

    let system_profiler_output = run_shell_comand(
        "sh",
        [
            "-c",
            r#"system_profiler SPHardwareDataType"#,
        ],
    )?;

    // Target only the Hardware UUID
    let target = "Hardware UUID";

(у меня только Мак и Windows)

doroved commented 4 months ago

@kurdin на текущий момент концепция либы такая, что ничего настраивать не нужно, а просто сразу получаешь хеш. Может в будущем, как доп опция будет, но не планировал. Насчет винды, сомневаюсь, что 100% юзеров каждый день меняют процессоры, а тот % кто сменил, может переактивировать лицензию. Генерировать mid на основе одного параметра сомнительная идея. Самое надежное решение для мака. Ограничиваться только Hardware UUID не стоит, остальные данные также не динамические.

doroved commented 4 months ago

У меня на виртуалке вообще только отдает csproduct через wmic, через poweshell команду - терминал просто закрывается. В общем на виртуалке такое тестить не вариант + это отличный способ отслеживать запуск софта на виртуалке, когда вместо значений сыпет Отсутствуют экземпляры. или вообще пусто, поэтому и надо собирать >1 значения, выбраны показатели, которые не изменяются или крайне редко могут измениться.

doroved commented 4 months ago

протестирвал на Windows, все работает.

Ты на виртуалке запускал? У меня на UTM win 11 вот так

image
kurdin commented 4 months ago

@doroved У меня все работает нормально на Mac с Parallel и Windows 11 Arm, а также на обычных Windows 10 и Windows 11 с Intel. Я пробовал твой dev код, и все работало. Но для себя я выбрал более простой вариант с получением только UUID, и это тоже работает хорошо. Вот мой код:

Windows https://github.com/PasteBar/PasteBarApp/blob/main/src-tauri/libs/mid-hardware-id/src/windows.rs Mac https://github.com/PasteBar/PasteBarApp/blob/main/src-tauri/libs/mid-hardware-id/src/macos.rs

Для моей задачи этого вполне достаточно. Честно говоря, я не понимаю, зачем нужно что-то еще, если у тебя есть доступ к Hardware UUID. Зачем добавлять что-то еще к уже достаточно уникальному UUID? Конечно, этот ID может быть не 100% уникальным среди всех существующих компьютеров, но, как мне кажется, этого вполне достаточно для большинства задач.

В общем, я выбрал более простой вариант, и он вполне подходит для моих нужд в плане уникальности.

Ошибка, которую ты видишь, думаю, говорит о том, что в UTM не реализовали нормальную поддержку WMI. Я давно перестал использовать UTM и перешел на платный Parallel — там проблем меньше, но тоже есть. Ты можешь попробовать еще поставить VMware Fusion Pro — его сейчас сделали бесплатным для личного пользования. https://blogs.vmware.com/teamfusion/2024/05/fusion-pro-now-available-free-for-personal-use.html

Спасибо тебе за библиотеку.

doroved commented 4 months ago

В общем, я выбрал более простой вариант, и он вполне подходит для моих нужд в плане уникальности.

Ну это самое главное.

Спасибо тебе за библиотеку.

🤝

kurdin commented 4 months ago

@doroved я почитал и поспрашивал ИИ насчет целесообразности добавления чего либо еще кроме Hardware UUID для получения уникального номера машины. Ты прав, что есть кейсы когда одного UUID мало и есть смысл добавить номера материнской платы и серийный номер процессора. Было бы неплохо сделать это опциями в будущем. Где по умолчанию будет добавляться все а если не нужно, то можно выбрать какие параметры использовать для формировании уникального номера машины. Но я бы сделал чуть проще и оставил только UUID, SerialNumber и ProcessorId. Думаю этого будет достаточно. Спасибо еще раз.

doroved commented 4 months ago

@kurdin да, я в обнимку с GPT изучал все + гугл и т.п. и выбрал самые лучшие варианты для создания хеша. Создавать уникальный хеш на одном параметре это вообще не эффективно, т.к.

  1. Значение параметра может быть пустым или в случае с виндой на уровне железки производители могут не возвращать айдишки и т.п.
  2. Возможность совпадения значений между устройствами
  3. и т.п.

С виндой и тем более линуксом в этом плане все не просто, самый идеальный вариант для мак. Смысл брать один показатель из того же SPHardwareDataType, когда можно взять другие, тем более доп запросы не нужны. + я изучил все параметры и опять же выбрал те, которые не меняются и не совпадают с другими устройствами.

+ я это делал для себя, поэтому достаточно скрупулезно изучал вопрос.