Локальная аутентификация пользователя в Windows NT
В ОС Windows NT для идентификации используется имя пользователя, а для подтверждения введенного имени – процедура аутентификации, использующая символьный пароль пользователя.
Обозначим через:
PasswordUniCode – пароль пользователя в формате UniCode;
PasswordASCII[0..13] – массив из 14 байт, пароль пользователя в формате ASCII;
PasswordDES[0..15] – массив из 16 байт, который назовем образом пароля пользователя, полученным при помощи алгоритма DES;
PasswordMD4 [0.. 15] – массив из 16 байт, который назовем образом пароля пользователя, полученным при помощи алгоритма MD4.
EncryptedText = DES(ClearText, Key) – функция преобразования по алгоритму DES, где ClearText и EncryptedText массивы по 8 байт – открытый и шифрованный текст соответственно, Key – массив из 7 байт, являющийся ключом;
HashText = MD4(ClearText) – функция преобразования по алгоритму хэширования MD4, где ClearText массив из 64 байт – открытый текст, HashText массив из 16 байт – хэшированный текст..
Алгоритм локальной идентификации пользователя состоит из следующих шагов:
Шаг 1.
Пользователь вводит с клавиатуры в ответ на запрос рабочей станции свое имя, имя домена и пароль в формате UniCode: PasswordUniCode.
Шаг 2.
PasswordUniCode преобразуется в формат ASCII, причем маленькие латинские буквы преобразуются в большие, результат записывается в PasswordASCII – массив из 14 байт. Если пароль короче 14 символов, оставшиеся байты массива PasswordASCII заполняются нулями.
Далее осуществляется преобразование:
PasswordDES[0..7]: = DES(ClearText, PasswordASCII[0..6]); PasswordDES[8..15]: = DES(ClearText, PasswordASCII[7..13]),
Где ClearText = (4B, 47, 53, 21, 40, 23, 24, 25) = "KGS!@#$%".
Шаг 3.
Осуществляется преобразование пароля пользователя с помощью алгоритма хэширования MD4:
PasswordMD4: = MD4(PasswordUniCode).
Шаг 4.
PasswordMD4 сравнивается с данными, которые вычисляются путем расшифрования данных, хранящихся в реестре, в начале загрузки операционной системы.
Шаг 5.
В случае успешной проверки на шаге 4 разрешается дальнейшая загрузка системы, в противном случае осуществляется переход к шагу 1.
При входе пользователя в систему из введенного им пароля выбираются 14 байт (при меньшей длине пароль дополняется нулями), которые затем дважды используются в качестве ключей для шифрования согласно алгоритму DES 8-ми байт, а именно: Ox4b,0x47.0x53.0x21.0x40.0x23.0x24.0x25, находящихся в файле advapi32.dll и являющихся заранее заданными постоянными значениями. При этом 14 байт пароля пользователя разбиваются на два отрезка по 7 байт каждый, которые затем представляются в виде последовательности из восьми 7-ми битовых векторов. Для получения ключа алгоритма DES с каждой из последовательностей выполняются следующие действия: каждый 7-ми битовый вектор переписывается в обратном порядке, расширяется до байта с приписыванием справа единицы, и к полученным 8-ми байтам применяется операция конкатенации. Полученный таким образом двоичный вектор длины 64 используется в качестве ключа.
Результаты шифрования исходных 8-ми байт на двух различных ключах, полученных из пароля пользователя, разбитые на два блока по 8 байт, дополняются справа нулями и разбиваются на три блока по 7 байт, из которых затем снова получаются в соответствии с описанным выше способом три 64-битовые вектора, используемые в качестве трех различных ключей при трех независимых вызовах процедуры шифрования, применяемых к полученному от сервера значении сеансового ключа (меняющегося от сессии к сессии). Результат шифрования в виде последовательности 24-х байт рассматривается как результат обработки пароля пользователя.