Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Тайна NEWID()  [new]
jimmers
Member

Откуда: Санкт-Петербург - New York City
Сообщений: 5070
Пораженный кошмарным количеством слухов о том, как генерируется значение типа uniqueidentifier, я решил
разобраться в вопросе хотя бы поверхностно. Все что я далее описываю относится только к рекомендованной
Microsoft конфигурации - Windows 2000 Server/Advanced Server + SQL Server 2000 SE/EE. Начал я с MSDN,
где сказано, что для нашего случая (Windows 2000) код функции Win32 API UuidCreate(...) не связать с
"железками", а именно, с MAC адресом сетевого интерфейса. То, что в основе T-SQL функции NEWID() лежит
именно UuidCreate(...) нетрудно проверить под отладчиком. Далее с символьного сервера Microsoft при
помощи WinDBG вытянул rpcrt4.dbg и rpcrt4.pdb. Скормив их IDA Pro, получил картину, поразившую меня.
Ниже схематично представлен алгоритм, как я его понял - от вершины и до функций нижнего уровня.


RPC_STATUS __stdcall UuidCreate(UUID *Uuid){
rc4_safe_select(x,x,x);
NewGenRandom(x,x,x,x);
rc4_safe_key(x,x,x,x);
}

__stdcall NewGenRandom(x,x,x,x)
{
NewGenRandomEx(x,x,x);
}

__stdcall NewGenRandomEx(x,x,x){
InitRand(x,x);
InitializeRNG(x);
GenRandom(x,x,x);
}

__stdcall InitRand(x,x){
InitCircularHash(x,x,x,x);
ReadSeed(x,x);
}

int __stdcall ReadSeed(LPBYTE lpData,DWORD cbData){
AccessSeed(x,x);
RegQueryValueEx("SOFTWARE\Microsoft\Cryptography\RNG\Seed");
}

int __stdcall AccessSeed(REGSAM samDesired,DWORD dwDisposition){
RegCreateKeyEx("SOFTWARE\Microsoft\Cryptography\RNG\Seed");
}

__stdcall InitializeRNG(x){
rc4_safe_startup(x);
InterlockedCompareExchangePointerWin95(x,x,x);
}

__stdcall InterlockedCompareExchangePointerWin95(x,x,x){
InterlockedCompareExchange();
}


__stdcall GenRandom(x,x,x){
RandomFillBuffer(x,x);

}

__stdcall RandomFillBuffer(x,x){
UpdateCircularHash(x,x,x);
rc4_safe_select(x,x,x);
GetCircularHashValue(x,x,x);
GatherRandomKey(x,x,x,x);
rc4_safe_key(x,x,x,x);
rc4_safe(x,x,x,x);
}


__stdcall UpdateCircularHash(x,x,x){
MD4Init(x);
MD4Update(x,x,x);
MD4Final(x);

}

int __stdcall GatherRandomKey(LPVOID lpInBuffer,DWORD nInBufferSize,LPVOID lpOutBuffer,LPDWORD lpBytesReturned){
GatherRandomKeyFastUserMode(x,x,x,x);
}

int __stdcall GatherRandomKeyFastUserMode(LPVOID lpInBuffer,DWORD nInBufferSize,LPVOID lpOutBuffer,LPDWORD lpBytesReturned){
IsRNGWinNT();
NtOpenFile("\\Device\\KsecDD");
InterlockedCompareExchangePointerWin95(x,x,x);
}


Таким образом, основа - это значение из реестра SOFTWARE\Microsoft\Cryptography\RNG\Seed, хэш MD4 и потоковый шифр RC4.
Никаких сетевых карт и прочих железок нет. Также трудно преставать как это может давать одинаковые значения на одной
машине, т.к. используются критические секции для предотвращения параллельной работы с данными нескольких потоков.
Конечно, неплохо бы разобраться подробнее, но времени пока нет - возможно кто-то уже делал что-то в этом роде?
6 фев 03, 01:16    [122962]     Ответить | Цитировать Сообщить модератору
 Re: Тайна NEWID()  [new]
YuriAM
Member

Откуда:
Сообщений: 829
Просто завидую твоему терпению :-)
6 фев 03, 08:12    [123010]     Ответить | Цитировать Сообщить модератору
 Re: Тайна NEWID()  [new]
snake
Member

Откуда: Russia, Penza
Сообщений: 2290
А как это может быть уникальным в пределах планеты?
Ведь, по - моему, так и утверждается!?
6 фев 03, 08:31    [123017]     Ответить | Цитировать Сообщить модератору
 Re: Тайна NEWID()  [new]
ТиБиБи
Member

Откуда: Москва
Сообщений: 906
2YuriAM:

Это скорее упорство, терпение проявляется в другом.

:~)
6 фев 03, 10:56    [123135]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Тайна NEWID()  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4257
--Никаких сетевых карт и прочих железок нет.

я бы не был столь категоричным

-- NtOpenFile("\\Device\\KsecDD");

обращение к драйверу KsecDD - и есть запрос hardware конфигурации.

именно этот драйвер вызывается при создании отчета "синий экран смерти" и при создании журнала аудита.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ddtools/hh/ddtools/devcon_86er.asp

однозначно утверждать, что аппаратная конфигурация используется я не могу, но ряд строчек из статьи дают пищу для размышлений :

--In response, DevCon displays the device instance IDs of the USB devices

-- The command specifies the Net class and then refines the search by specifying devices in the class whose hardware ID or compatible ID include "ndiswan."

--In response, DevCon displays the device instance ID of the device and reports the result.
10 мар 04, 22:35    [571306]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Тайна NEWID()  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62926
snake
А как это может быть уникальным в пределах планеты?
Ведь, по - моему, так и утверждается!?

Обеспечивается уникальностью MAC адреса, не относится к китайским сетевым платам, но их по определению нельзя считать такими.
14 апр 05, 19:52    [1469937]     Ответить | Цитировать Сообщить модератору
 Re: Тайна NEWID()  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4257
--Обеспечивается уникальностью MAC адреса, не относится к китайским сетевым платам, но их по определению нельзя считать такими

как-то видел партию сановских машин - у все был одинаковый MAC на карточках.
14 апр 05, 20:49    [1470006]     Ответить | Цитировать Сообщить модератору
 Re: Тайна NEWID()  [new]
VladRUS.ca
Member

Откуда: Toronto
Сообщений: 1172
To jimmers: Спасибо за код. Не всякий копнёт так глубоко!

Может кто-нибудь объяснить отчего при генерации на разных машинах NEWID() у меня всегда 4 на этой позиции?

xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx
14 апр 05, 22:07    [1470089]     Ответить | Цитировать Сообщить модератору
 Re: Тайна NEWID()  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4257
номер континента ? :)
14 апр 05, 22:10    [1470092]     Ответить | Цитировать Сообщить модератору
 Re: Тайна NEWID()  [new]
VladRUS.ca
Member

Откуда: Toronto
Сообщений: 1172
Lepsik
номер континента ? :)

Если это не шутка - можно ссылочку
14 апр 05, 22:17    [1470098]     Ответить | Цитировать Сообщить модератору
 Re: Тайна NEWID()  [new]
А.Панков
Member

Откуда: Toronto
Сообщений: 523
Lepsik
номер континента ? :)

А кроме шуток, ребята, проверьте, а? Я вот в северной америке, как и VladRUS, у меня тоже четверка выдается в этой позиции.
14 апр 05, 22:52    [1470119]     Ответить | Цитировать Сообщить модератору
 Re: Тайна NEWID()  [new]
(c)VIG
Member

Откуда:
Сообщений: 1507
Евразия,Ближний Восток-тоже самое.
Так что, не номер континента :)
14 апр 05, 23:18    [1470147]     Ответить | Цитировать Сообщить модератору
 Re: Тайна NEWID()  [new]
А.Панков
Member

Откуда: Toronto
Сообщений: 523
Номер планеты?
14 апр 05, 23:45    [1470171]     Ответить | Цитировать Сообщить модератору
 Re: Тайна NEWID()  [new]
VIK@work
Guest
А.Панков
Номер планеты?

В центуре :)
15 апр 05, 03:47    [1470294]     Ответить | Цитировать Сообщить модератору
 Re: Тайна NEWID()  [new]
Alex Antonoff
Member

Откуда: Из лесу вестимо
Сообщений: 1251
Что то я где то читал, что из за security reason, был изменен алгоритм генерации GUID, как минимум на КПК он работает по другому
15 апр 05, 07:12    [1470355]     Ответить | Цитировать Сообщить модератору
 Re: Тайна NEWID()  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62926
Alex Antonoff
Что то я где то читал, что из за security reason, был изменен алгоритм генерации GUID, как минимум на КПК он работает по другому
Есть такое дело, изменен возвращаемый формат, МАС адрес шифруется.
15 апр 05, 07:46    [1470380]     Ответить | Цитировать Сообщить модератору
 Re: Тайна NEWID()  [new]
jimmers
Member

Откуда: Санкт-Петербург - New York City
Сообщений: 5070
SELECT NEWID()

9924E8B6-6A0A-4B5D-A403-531B91410A8E
...
1A6A3C31-7A49-4039-AF61-025912B5A750

		public __stdcall UuidCreate(x)
__stdcall UuidCreate(x)	proc near

arg_0		= dword	ptr  8

		push	esi
		mov	esi, [esp+arg_0]
		push	10h
		push	esi
		call	GenerateRandomNumber(uchar *,int)
		test	eax, eax
		jnz	short loc_77C5BF5D
		mov	ax, [esi+6] <- HERE IT IS
		and	ax, 0FFFh
		or	ax, 4000h
		mov	[esi+6], ax
		mov	al, [esi+8]
		and	al, 3Fh
		or	al, 80h
		mov	[esi+8], al
		xor	eax, eax

loc_77C5BF5D:
		pop	esi
		retn	4
__stdcall UuidCreate(x)	endp


XXXXXXXXXXXXXXXX <- AX
AND
0000111111111111
OR
0100000000000000

Нетрудно видеть, что старший бит после операции OR будет обнулён вне зависимости от значения AX,
а следующий за ним - будет всегда выставлен, что и означает, что число в AX будет начинаться с 4.

С уважением,
Мартин Рахманов
http://jimmers.russia.webmatrixhosting.net/
15 апр 05, 11:59    [1471012]     Ответить | Цитировать Сообщить модератору
 Re: Тайна NEWID()  [new]
VladRUS.ca
Member

Откуда: Toronto
Сообщений: 1172
Пока в инете нашёл что это версия UUID:
Versions of Universally Unique Identifiers (UUID):

1. Time-based with unique or random host identifier (combination of node identifier (MAC address), timestamp and a random seed)
2. DCE Security version (with POSIX UIDs)
3. Name-based (MD5 hash)
4. Random
5. Name-based (SHA-1 hash)
15 апр 05, 17:46    [1472720]     Ответить | Цитировать Сообщить модератору
 Re: Тайна NEWID()  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4257
VladRUS.ca
Пока в инете нашёл что это версия UUID:
Versions of Universally Unique Identifiers (UUID):

1. Time-based with unique or random host identifier (combination of node identifier (MAC address), timestamp and a random seed)
2. DCE Security version (with POSIX UIDs)
3. Name-based (MD5 hash)
4. Random
5. Name-based (SHA-1 hash)


неполный у вас ответ

UUID Variants and Versions
A UUID has a variant and version. The variant defines the layout of the UUID. The version defines the content of the UUID. The UUID variant supported in OSSP uuid is the DCE 1.1 variant only. The DCE 1.1 UUID variant versions supported in OSSP uuid are:

Version 1 (time and node based)

These are the classical UUIDs, created out of a 60-bit system time, a 14-bit local clock sequence and 48-bit system MAC address. The MAC address can be either the real one of a physical network interface card (NIC) or a random multi-cast MAC address. Version 1 UUIDs are usually used as one-time global unique identifiers. 

Version 3 (name based, MD5)

These are UUIDs which are based on the 128-bit MD5 message digest of the concatenation of a 128-bit namespace UUID and a name string of arbitrary length. Version 3 UUIDs are usually used for non-unique but repeatable message digest identifiers. 

Version 4 (random data based)

These are UUIDs which are based on just 128-bit of random data. Version 4 UUIDs are usually used as one-time local unique identifiers. 

Version 5 (name based, SHA-1)

These are UUIDs which are based on the 160-bit SHA-1 message digest of the concatenation of a 128-bit namespace UUID and a name string of arbitrary length. Version 5 UUIDs are usually used for non-unique but repeatable message digest identifiers. 


For UUID version 4, the node field is a randomly or pseudo-randomly generated 48 bit value.

Microsoft говорит, что начиная с Win2000 использует UUID version 4. (MSDN, "Generating GUIDs on the Pocket PC")

Before Windows 2000, the CoCreateGuid function generated version 1 GUIDs. With Windows 2000, Microsoft switched to version 4 GUIDs, since embedding the MAC address was viewed as a security risk.
9 янв 06, 20:40    [2237674]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Тайна NEWID()  [new]
Николай Денищенко
Member

Откуда: Москва
Сообщений: 346
Забил последний гвоздь в крышку гроба NEWID():

Устройство и криптоанализ UUID-генератора в ОС Windows

Будем считать эту тайну раскрытой? ;)

---------------------------
Я люблю ЖЖизнь и Гайки крутить
24 июн 08, 11:27    [5838599]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Тайна NEWID()  [new]
enakenenaken
Member

Откуда: Нижний Новгород
Сообщений: 325
А сколько всего значений? Не может он закончиться?
24 ноя 14, 18:23    [16898280]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Тайна NEWID()  [new]
rnk
Member

Откуда:
Сообщений: 126
enakenenaken
А сколько всего значений? Не может он закончиться?

Закончится рано или поздно. Обещают, что не раньше XXII века, но голову на отсечение никто не даст. Перейдём на 256-битные или даже подлиннее, куда уж денемся...
27 июн 17, 16:31    [20594451]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить