Создание идентификатора, уникального для конкретного компьютера

Возможный дубликат:
Надежный способ создания уникальных идентификатор оборудования

Я пытаюсь создать идентификатор, который будет уникальным для конкретного компьютера. Идентификатор не будет генерироваться случайным образом. Он будет основан на расчетах, так что идентификатор, сгенерированный для компьютера A, будет фиксированным и уникальным для компьютера A. Каждый раз, когда программа выполняется на компьютере A, она будет продолжать генерировать тот же идентификатор, а при выполнении на другом компьютере будет генерировать другой идентификатор, уникальный для этого компьютера. Это необходимо для того, чтобы два компьютера не имели одинаковых идентификаторов.

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

Мой вопрос: Как я могу получить значение, уникальное для компьютера, чтобы использовать это значение в качестве начального числа в программе генерации идентификатора?

Можно ли получить от аппаратного обеспечения компьютера (например, материнской платы) значение, уникальное для этого компьютера? Таким образом, значение, скорее всего, не изменится, пока не будет заменена материнская плата компьютера.


person Dami Lola    schedule 05.09.2010    source источник
comment
Это невозможно сделать каким-либо осмысленным способом, который не может быть ниспровергнут достаточно мотивированным владельцем компьютера. Если вы пытаетесь найти способ, позволяющий устройствам уникально отличаться от других, к которым они подключены, это другой вопрос, для которого существуют совместные решения.   -  person msw    schedule 05.09.2010
comment
А как насчет виртуальных машин, у которых нет физических компонентов? Две виртуальные машины - это одна и та же машина, если у них одинаковые данные конфигурации?   -  person emory    schedule 05.09.2010
comment
Большое спасибо за быстрый ответ, ребята. Можно ли узнать идентификатор первичного процессора компьютера. Я видел нечто подобное где-то в Интернете, но это на C #. Интересно, удастся ли добиться того же на Java.   -  person Dami Lola    schedule 05.09.2010


Ответы (7)


MAC-адрес? Это (для практических целей) уникально для каждого сетевого адаптера, поэтому оно гарантирует воспроизводимость, даже если пользователь выполняет двойную загрузку. . Конечно, есть редкие случаи, когда люди обмениваются картами, но в сочетании с другими показателями (не используйте только это, поскольку сетевые карты можно менять), это все еще возможно.

Как бы вы это получили?

public static byte[] getMACAddress() throws SocketException, UnknownHostException {
    InetAddress address = InetAddress.getLocalHost();
    NetworkInterface networkInterface = NetworkInterface.getByInetAddress(address);

    return networkInterface.getHardwareAddress();
}

Если вам нужно представление String, сделайте это

for (int byteIndex = 0; byteIndex < macAddress.length; byteIndex++) {
    System.out.format("%02X%s", macAddress[byteIndex], (byteIndex < macAddress.length - 1) ? "-" : "");
}

(спасибо http://www.kodejava.org/examples/250.html)

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

person TheLQ    schedule 05.09.2010
comment
На той же странице Википедии, на которую вы ссылаетесь, есть ссылка на en.wikibooks.org/wiki/Changing_Your_MAC_Address MAC-адреса не уникальны. - person msw; 05.09.2010
comment
Не полностью уникальны и нет никаких гарантий, на самом деле адреса известны как повторно используемые, но почти уникальные и почти гарантированно, конечно ... - person DigitalRoss; 05.09.2010
comment
@msw @DigitalRoss Оборудование может быть удалено, оборудование может быть изменено, оборудование может быть подделано и т. д. Нет никакой гарантии уникальности. Mac-адреса достаточно уникальны. См. Обновление - person TheLQ; 05.09.2010
comment
Пожалуйста, не заставляйте меня переустанавливать программное обеспечение, если я поменяю сетевую карту. - person Michael Petrotta; 05.09.2010
comment
MAC-адреса также могут быть изменены пользователем. Они определенно недостаточно уникальны. - person user207421; 05.09.2010
comment
@EJP В 95% случаев они не подделываются пользователем. Вы говорите о небольшой группе населения, которая: A) даже знает, как это сделать, B) параноик и C) заботится. - person TheLQ; 05.09.2010
comment
@TheLQ Другими словами, это не уникально. - person user207421; 05.09.2010
comment
@EJP невозможно найти гарантированно уникальный идентификатор. Не гарантируется, что даже случайное число размером 2 ^ 128 бит будет уникальным. Очень маловероятно, что кто-то другой сгенерирует такое же число в том же контексте. - person extraneon; 05.09.2010
comment
@extraneon Другими словами, это не уникально! И изменение MAC-адресов пользователями не является случайным процессом. - person user207421; 07.09.2010
comment
Что, если пользователь переключится с LAN на WiFi? Какой тогда MAC-адрес используется? - person Tomáš Zato - Reinstate Monica; 26.03.2015
comment
это не хорошее решение, идентификатор должен быть создан из идентификатора процессора, диска и основной платы, который показывает реальное оборудование машины. пользователь может удалить и установить новые сетевые карты, но. - person M2E67; 24.11.2018

Win32 генерирует идентификатор безопасности компьютера, который должен быть уникальным для каждой установки, которую вы можете получить через WMI или Active Directory, но это в значительной степени зависит от платформы. Вы также можете использовать MAC-адрес, как уже упоминали все, просто убедитесь, что это физический сетевой адаптер, поскольку виртуальные адаптеры, как правило, используют один и тот же MAC-адрес на разных компьютерах.

Однако UUID (или GUID) - это 128-битные числа, которые должны быть гарантированно уникальными, и были фактически созданы с целью решения проблемы генерации уникальных идентификаторов на множестве случайных машин. Согласно Википедии:

Чтобы представить эти числа в перспективе, годовой риск столкновения с метеоритом оценивается в один шанс из 17 миллиардов [25], что означает, что вероятность составляет около 0,00000000006 (6 × 10-11), что эквивалентно шансам создания несколько десятков триллионов UUID в год и наличие одного дубликата. Другими словами, только после генерации 1 миллиарда UUID каждую секунду в течение следующих 100 лет вероятность создания только одного дубликата составит около 50%. Вероятность одного дубликата составит около 50%, если каждый человек на Земле владеет 600 миллионами UUID.

Общее количество возможных комбинаций составляет 2 ^ 128 (или 3 x 10 ^ 38), поэтому я склонен в это верить. Кроме того, большинство современных генераторов UUID больше не используют алгоритм V1 (то есть тот, который основан на MAC-адресе), поскольку он считается проблемой безопасности из-за того, что можно определить, когда был сгенерирован GUID, и кто его сгенерировал. . В мире Win32 исправление безопасности, относящееся к Windows 2000 или NT 4, было изменено для использования версии алгоритма V4, которая основана на псевдослучайном числе вместо MAC, а JVM всегда использовала версию V3 / V4.

РЕДАКТИРОВАТЬ: метод, используемый для генерации UUID в Java, осуществляется через класс java.util.UUID.

person Javert93    schedule 05.09.2010
comment
Так будет ли выполнение UUID.fromString("some string"); сгенерировать один и тот же точный UUID для нескольких экземпляров ВМ? А как насчет того же компьютера, но в другой ОС? - person TheLQ; 05.09.2010
comment
@TheLQ: некоторая строка не может быть проанализирована :) Вы читали ietf.org/rfc/rfc4122. txt? - person extraneon; 05.09.2010
comment
@TheLQ: синтаксис будет UUID.fromString("{00000000-0000-0000-0000-000000000000}"), и будет использоваться для преобразования существующего строкового представления UUID в класс UUID, так что да, вы получите один и тот же UUID каждый раз для одного и того же входного значения (при условии, что вы жестко закодировали ввод нить). Чтобы сгенерировать новый UUID, вы должны использовать UUID.randomUUID(), который должен быть уникальным для нескольких экземпляров ВМ. - person Javert93; 05.09.2010
comment
Я забыл об этом упомянуть, но то же самое и для разных ОС. - person Javert93; 05.09.2010
comment
UUID ничего не решает. Сгенерированные данные должны храниться в файле. Файл можно украсть или скопировать. Мне нужно что-то, что является частью системы / компьютера и не может быть легко украдено, взяв в руки файл настроек. - person Tomáš Zato - Reinstate Monica; 26.03.2015

Самый простой способ сделать это - прочитать информацию об оборудовании Ethernet или «Mac» -адресе.

http://download.oracle.com/javase/6/docs/api/java/net/NetworkInterface.html#getHardwareAddress()

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

person DigitalRoss    schedule 05.09.2010

MAC-адрес достаточно уникален для того, что вы. См. http://en.wikipedia.org/wiki/MAC_address.

Вы не указали, какой язык используете. На некоторых языках это может быть проще, чем на других. Вот как это сделать в Java http://www.kodejava.org/examples/250.html. Погуглите свой язык.

person Christian Garbin    schedule 05.09.2010
comment
К счастью, теги сообщений действительно указывают, какой язык он использует. И три человека дали этот ответ, прежде чем я закончил печатать свой ... Я думаю, что это новый рекорд. :) - person Dan J; 05.09.2010

Лучше всего использовать в качестве идентификатора MAC-адрес основного сетевого адаптера.

Это потенциально может измениться в какой-то момент, но это касается и любого отдельного жесткого компонента.

FYI GUID рассчитываются с использованием MAC-адреса.

person ocodo    schedule 05.09.2010
comment
Ха-ха ... 4 по цене одного. - person ocodo; 05.09.2010

Есть ли у вас доступ к какой-либо информации, описанной в этой статье? Только для Windows

http://msdn.microsoft.com/en-us/library/aa394587.aspx

Серийный номер, бирка актива

person James    schedule 05.09.2010
comment
Связан ли серийный номер с Windows или серийный номер фактического производителя? - person avacariu; 05.09.2010
comment
Это относится к физическому корпусу. Я указал, что это решение только для Windows, если оно работает. - person James; 05.09.2010

Другой вариант, если вы используете чипы Intel, - это серийный номер процессора, если вы можете убедиться, что эта функция включена. Дополнительную информацию см. В примечании к серийному номеру Intel.

person Mark Mullin    schedule 05.09.2010
comment
Он использует Java, нет понятия о процессоре :) - person L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o&#x; 05.09.2010