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;
}