LAN Manager

По алгоритму LAN Manager пакет аутентификации Windows вычисляет хеш-значение введённого пользователем пароля и обращается к диспетчеру учетных запи­сей (Security Account Manager, SAM) для сравнения с хеш-значением пароля, хранящегося в БД учетных записей. Для вычисления хеш-значения выполняются следующие действия:

1. Все буквенные символы (латинского алфавита) строки пароля Р преобразуются к верхнему регистру.

2. Строка символов пароля дополняется нулями, если она короче 14 байтов, и делится на две семибайтовые половины P1 и Р2.

3. Каждое из значений P1 и Р2 используется в качестве ключа для шифрования по алгоритму DES-ECB магической строки М = "KGS!@#$%", в результате которого получаются два значения, из 64 бит каждое: H1 = ЕР1(М) и Н2 = ЕР2(М).

4. Выполняется шифрование по алгоритму DES-ECB на ключе, равном относительному номеру учетной записи, результата сцепления H1 и Н2: ERID(H1 || H2); RID учетной записи «Администратор» равен 500.

5. Полученный результат шифрования помещается в базу данных SAM.

Хеширование паролей в Unix

Пароли пользователей записываются в файл учетных записей в хешированном виде. Применяется следующий алгоритм хеширования:

1) на основе времени генерируется случайное значение, которое затем преобразуется в строку из двух символов и запоминается как первые два символа поля с хеш-значением пароля;

2) магическое значение длиной 64 бита, состоящее из нулей или пробелов, зашифровывается по алгоритму DES, причем в качестве ключа шифрования длиной 56 бит используется пароль пользователя, а случайное значение (salt) применяется для модификации алгоритма шифрования;

3) полученное значение длиной 64 бита вновь зашифровывается на том же ключе (общее число повторений равно 25);

4) полученное окончательное значение преобразуется в 11 символов (каждым шести битам соответствует один символ из множества {'.', '/', '0'-'9', 'A'-'Z', 'a'-'z'});

5) полученная строка символов записывается в файл учетных записей после случайного значения.

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

FCS

 

PJW-32

PJW-32 (PJWHash) - хэш-функция, разработанная Питером Вэйнбергером (Peter J. Weinberger).

Алгоритм PJW:

Вход: массив символов М; Результат: h

// инициализация

h, g = 0

// основной код

for каждого i-го символа входного массива М:

h = (h << 4) + Мi;

if g = (h & 0xF0000000) then

h = h xor (g >> 24);

h = h xor g

h = h mod 211

 

Пример:

Вход: a {английская раскладка}

Результат: 97

 

Пример реализации на языке С

/*Peter Weinberger's*/

int hashpjw(char *s)

{

char *p;

unsigned int h,g;

h=0;

for (p=s; *p != '\0'; p++)

{

h = (h<<4) + *p;

if (g = h & 0xF0000000)

{

h ^= g>>24;

h ^= g;

}

}

return h%211;

}

 

unsigned int PJWHash (char *str, unsigned int len)

{

unsigned int BitsInUnsignedInt = (unsigned int) (sizeof (unsigned int) * 8);

unsigned int ThreeQuarters = (unsigned int) ((BitsInUnsignedInt * 3) / 4);

unsigned int OneEighth = (unsigned int) (BitsInUnsignedInt / 8);

unsigned int HighBits = (unsigned int) (0xFFFFFFFF) <<

(BitsInUnsignedInt - OneEighth);

unsigned int hash = 0;

unsigned int test = 0;

unsigned int i = 0;

for (i = 0; i < len; str++, i++) {

hash = (hash << OneEighth) + (unsigned char)(*str);

if ((test = hash & HighBits) != 0) {

hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits));

}

}

return hash;

}