Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.06.2010, 03:22
Marx Marx вне форума
Прохожий
 
Регистрация: 26.11.2009
Сообщения: 13
Репутация: 10
По умолчанию Уникальный идентификатор компьютера (Hardware ID)

Уважаемые программисты подскажите как можно составить уникальный идентификатор компьютера, точнее из чего - из ID/SerialNumber каких устройств (мат плата, процессор, жесткий диск и т.д.) можно составить уникальный идентификатор?

З.Ы. MAC-адрес не предлагать
Ответить с цитированием
  #2  
Старый 27.06.2010, 06:41
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А чем MAC-адрес как составная часть UID'а не годится?
Ну еще:
- Family процессора
- Stepping процессора
- уникальный номер процессора, если есть
- серийник BIOS
- серийник системного тома (диска С)
- серийник матери, если доступен
- имена производителей железа, если сможешь вытащить.
Все это собирается в строку, которую потом обрабатываешь какой-нить хэш-функцией для обезличивания и укорачивания.

Последний раз редактировалось Admin, 23.04.2023 в 18:32.
Ответить с цитированием
  #3  
Старый 27.06.2010, 09:10
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

такое подойдет:
PHP код:
unit Unit1;

interface

uses
  ActiveX
,
  
WindowsMessagesSysUtilsVariantsClassesGraphicsControlsForms,
  
DialogsStdCtrls;

type
  TForm1 
= class(TForm)
    
Memo1TMemo;
    
procedure FormCreate(SenderTObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
Form1TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(SenderTObject);
var
  
guidTGUID;
  
iInteger;
begin
  
for i:=1 to 255 do
  
begin
    CoCreateGuid
(guid);
    
Memo1.Lines.Add(GUIDToString(guid));
  
end;
end;

end
?
результат:
Цитата:
{AC7CDAAA-C80F-4F0E-B91F-41EC8BA6716F}
{049B755C-D99F-4C4B-8E9E-3C9D1A0767AF}
{2444963E-992A-46FC-9454-8CD3E4F0EA94}
{8188B285-5EB9-4AE6-A0B4-C0BA69C9DC69}
{66634182-C8CE-44FC-8DF8-0F18F1788073}
...
{F15F5FE1-219E-44CC-A5C5-50E40A711BE4}
{A265A3A3-520A-4DED-993A-91E6E73A8739}
{6FDE4DBC-FE25-46C5-8243-11463D2E7B9C}
{68D1AD21-177D-42E5-B28F-5CF8F84FC75A}
{F5FCC1AC-869A-4CDD-9C44-B30A95857399}
Ответить с цитированием
  #4  
Старый 27.06.2010, 17:08
Marx Marx вне форума
Прохожий
 
Регистрация: 26.11.2009
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
такое подойдет:
PHP код:
unit Unit1;

interface

uses
  ActiveX
,
  
WindowsMessagesSysUtilsVariantsClassesGraphicsControlsForms,
  
DialogsStdCtrls;

type
  TForm1 
= class(TForm)
    
Memo1TMemo;
    
procedure FormCreate(SenderTObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
Form1TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(SenderTObject);
var
  
guidTGUID;
  
iInteger;
begin
  
for i:=1 to 255 do
  
begin
    CoCreateGuid
(guid);
    
Memo1.Lines.Add(GUIDToString(guid));
  
end;
end;

end
?
результат:


GUID не подходит в качестве Harware ID, т.к. он меняется из раза в раз. Где-то читал что для его генерации используется время...
Ответить с цитированием
  #5  
Старый 27.06.2010, 17:10
Аватар для Marvel
Marvel Marvel вне форума
Начинающий
 
Регистрация: 14.06.2010
Адрес: Пятигорск
Сообщения: 121
Репутация: 24
По умолчанию

я как-то делал так (лет много-много назад): брал Windows Product ID:
Код:
function ProductID: string;
begin
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_LOCAL_MACHINE;
  Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion',false);
  Result := Reg.ReadString('ProductId');
  Reg.Free;
end;
HardDisk ID:
Код:
function GetHardID:string;
var
  SerialNum: dword;
  a, b: dword;
  Buffer: array [0..255] of char;
begin
  if GetVolumeInformation('c:\', Buffer, SizeOf(Buffer), @SerialNum, a, b, nil, 0) then Result := IntToStr(SerialNum);
end;
BiosInfo:
Код:
function BIOSInfo(OS: string):string;
var
  p: pointer;
  s: string[255];
begin
  if OS='NT' then begin with TRegistry.Create do
    try RootKey := HKEY_LOCAL_MACHINE;
      if OpenKeyReadOnly('HARDWARE\DESCRIPTION\System') then Result := ReadString('SystemBiosDate')
    finally
      Free;
    end;
  end
  else try
    s[0] := #8;
    p := Pointer($0FFFF5);
    Move(p^,s[1],8);
    Result := copy(s,1,2) + '/' + copy(s,4,2) + '/' +copy (s,7,2);
  except Result := 'XX.XX.XXXX';
  end;
end;
использовать так
Код:
BiosInfo('NT');
// для Win9x - BiosInfo('');
складывал этот в string строку и извлекал из этого MD5 Hash. Подделать такое проблематично
Код:
HardwareID := MD5(ProductID + GetHardID + BiosInfo('NT'));
Далее, можно от полученного MD5 "отрезать" половину (или вырезать символы через один) и юзать, подобрать такой hash будет невозможно

P.S. MD5 Unit прилагается во вложении.
Вложения
Тип файла: zip md5.zip (5.9 Кбайт, 276 просмотров)
__________________
Коли навчався в школі я - в мені росли мозгЫ. КудИж вони поділися? гы-гы гы-гы гы-гы...


ICQ: 593977748
Nick: Marvel

Последний раз редактировалось Marvel, 27.06.2010 в 17:32.
Ответить с цитированием
  #6  
Старый 27.06.2010, 17:13
Marx Marx вне форума
Прохожий
 
Регистрация: 26.11.2009
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
А чем MAC-адрес как составная часть UID'а не годится?
Ну еще:
- Family процессора
- Stepping процессора
- уникальный номер процессора, если есть
- серийник BIOS
- серийник системного тома (диска С
- серийник матери, если доступен
- имена производителей железа, если сможешь вытащить.
Все это собирается в строку, которую потом обрабатываешь какой-нить хэш-функцией для обезличивания и укорачивания.

MAC-адрес легко подменить и "При включении bluetooth/wi-fi появляется новая "сетевая карта". При отключенном сетевом проводе MAC-адрес не определяется." Вот нашел статейку Как получить hardware id. Исходники DiskID32 на Delphi . Раньше думал получать инфу через WMI, но после этой статьи больше склоняюсь к использованию серийного номера жесткого диска. Вопрос такой: действительно этот номер уникальный?
Ответить с цитированием
  #7  
Старый 27.06.2010, 17:31
Marx Marx вне форума
Прохожий
 
Регистрация: 26.11.2009
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от Marvel
я как-то делал так: брал Windows Product ID:
Код:
function ProductID: string;
begin
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_LOCAL_MACHINE;
  Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion',false);
  Result := Reg.ReadString('ProductId');
  Reg.Free;
end;
HardDisk ID:
Код:
function GetHardID:string;
var
  SerialNum: dword;
  a, b: dword;
  Buffer: array [0..255] of char;
begin
  if GetVolumeInformation('c:\', Buffer, SizeOf(Buffer), @SerialNum, a, b, nil, 0) then Result := IntToStr(SerialNum);
end;
BiosInfo:
Код:
function BIOSInfo(OS: string):string;
var
  p: pointer;
  s: string[255];
begin
  if OS='NT' then begin with TRegistry.Create do
    try RootKey := HKEY_LOCAL_MACHINE;
      if OpenKeyReadOnly ('HARDWARE\DESCRIPTION\System') then result := ReadString('SystemBiosDate')
    finally
      Free;
    end;
  end
  else try
    s[0] := #8;
    p := Pointer($0FFFF5);
    Move(p^,s[1],8);
    result := copy(s,1,2) + '/' + copy(s,4,2) + '/' +copy (s,7,2);
  except result := 'XX.XX.XXXX';
  end;
end;
использовать так
Код:
BiosInfo('NT'))
для Win9x
Код:
BiosInfo('98'))
складывал этот в string строку и извлекал из этого MD5 Hash. Подделать такое проблематично
Код:
HardwareID := MD5(ProductID + GetHardID + BiosInfo('NT'));

Спасибо за код, но у меня несколько вопросов:
  1. Разве читать инфу из реестра это есть хорошо? Она же может быть легко изменена...
  2. GetVolumeInformation - получает серийный номер логического диска, насколько я знаю, он не обладает свойством уникальности, в отличие от номера физического диска
  3. про MD5 Hash еще не разбирал, но разве хеширование (иногда) не дает одинаковые результаты при разных входных сообщениях? Т.е. не будут ли два разных компа с одинаковыми HardwareID (а тем более если отрезать от полученного хеща половину или брать через букву)?



Последний раз редактировалось Marx, 27.06.2010 в 17:35.
Ответить с цитированием
  #8  
Старый 27.06.2010, 17:34
Аватар для Marvel
Marvel Marvel вне форума
Начинающий
 
Регистрация: 14.06.2010
Адрес: Пятигорск
Сообщения: 121
Репутация: 24
По умолчанию

Marx:
  1. Ну из реестра читать не очень хорошо, это понятно, подменить можно всё.
  2. Я просто пытался показать как можно реализовать, можно и читать серийный номер винта, думаю в инете есть по этому инфа.
  3. не будут, ибо это 1 раз на миллиард миллиардов (может чуть-чуть чаще)
__________________
Коли навчався в школі я - в мені росли мозгЫ. КудИж вони поділися? гы-гы гы-гы гы-гы...


ICQ: 593977748
Nick: Marvel

Последний раз редактировалось Marvel, 27.06.2010 в 17:39.
Ответить с цитированием
  #9  
Старый 27.06.2010, 17:40
Marx Marx вне форума
Прохожий
 
Регистрация: 26.11.2009
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от Marvel
Marx:
  1. Ну из реестра читать не очень хорошо, это понятно, подменить можно всё.
  2. Я просто пытался показать как можно реализовать, можно и читать серийный номер винта, думаю в инете есть по этому инфа.
  3. проблематично будет всё равно подобрать, особенно если модифицировать сам MD5

Ок, буду читать номер винта. На счет последнего, даже если не подбирать Hardware ID, меняя какието параметры (номер винта, дату биоса, ProductID и т.д.), возможно ли совпадение Hardware ID на разных компах? Если да, то стоит ли использовать хеширование вообще(в данном случае)?
Ответить с цитированием
  #10  
Старый 27.06.2010, 17:51
Аватар для Marvel
Marvel Marvel вне форума
Начинающий
 
Регистрация: 14.06.2010
Адрес: Пятигорск
Сообщения: 121
Репутация: 24
По умолчанию

думаю совпадение может быть только в дате BIOS'а (BiosInfo) - на этот параметр лучше не надеяться. В остальном - проблематично будет подобрать (даже очень) Хеширование поможет запутать и сделать вид более похожий на серийник Windows, если в в некоторых местах поставить чёрточки
__________________
Коли навчався в школі я - в мені росли мозгЫ. КудИж вони поділися? гы-гы гы-гы гы-гы...


ICQ: 593977748
Nick: Marvel

Последний раз редактировалось Marvel, 27.06.2010 в 17:55.
Ответить с цитированием
  #11  
Старый 28.06.2010, 13:44
Marx Marx вне форума
Прохожий
 
Регистрация: 26.11.2009
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от Marvel
думаю совпадение может быть только в дате BIOS'а (BiosInfo) - на этот параметр лучше не надеяться. В остальном - проблематично будет подобрать (даже очень) Хеширование поможет запутать и сделать вид более похожий на серийник Windows, если в в некоторых местах поставить чёрточки

Marvel, спасибо за помощь.
А никто не знает какие еще устройства, кроме жесткого диска с серийным номером и сетевой платы с MAC-адресом, обладают уникальными параметрами? Т.е. не повторяющимися на других компах

Последний раз редактировалось Marx, 28.06.2010 в 18:52.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:40.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter