Проблемы с шифрованием Python MD5, SHA512 (+salt)

Я пытаюсь понять, как Linux шифрует наш пароль в файле etc/shadow, поэтому у меня нет нового виртуального «тестового» пользователя, чтобы провести тест:

пользователь: newuser
пароль: usrpw123
Созданная соль: Ii4CGbr7

Таким образом, ОС создает следующую строку в файле etc/shadow, используя систему шифрования SHA512 (6$): :::

Теперь я беру модуль SHA512 из python и пробую следующее:

import hashlib
m = hashlib.sha512()
m.update('Ii4CGbr7'+'usrpw123')
print m.hexdigest

В результате я получаю следующий хеш:

Как видите, он отличается от другого в файле /etc/shadow, и я не знаю почему, если я использую ту же соль + пароль для генерации хэша.
Может ли кто-нибудь помочь мне и объяснить мне более или менее почему это происходит?

А также, почему файлы /etc/shadow создают хэш с несколькими точками (.)?
Спасибо.


person Borja    schedule 05.04.2011    source источник
comment
Обратите внимание, что шестнадцатеричный дайджест включает только [0-9a-f] символов, а строка в файле shadow[0-9a-zA-Z/.], поэтому форматы вывода отличаются для начала...   -  person sarnold    schedule 05.04.2011
comment
SHA не является системой шифрования. SHA — это хэш-функция. Между ними есть большая разница.   -  person NullUserException    schedule 16.11.2011


Ответы (3)


Поля в /etc/shadow не создаются и не интерпретируются так, как вы думаете. Вам следует прочитать справочную страницу для детали, но самое очевидное отличие состоит в том, что он использует необычную кодировку base64 как для соли, так и для хеша.

person ʇsәɹoɈ    schedule 05.04.2011
comment
Знаете ли вы какой-нибудь код, который я могу использовать для эмуляции шифрования MD5/SHA512 на Python? Я хотел бы сделать функцию, которая выполняет тот же выход, что и файл /etc/shadow. ‹br› Еще раз спасибо - person Borja; 05.04.2011
comment
@Borja: Для этого буквально нужно перевести код C на Python. Никого это не волнует, так как системную библиотеку можно вызвать прямо из Python. Возможно, кто-то написал библиотеку-мост, аналогичную вызову crypt(). - person dma_k; 13.11.2013

Существует алгоритм генерации хэшей паролей, найденных в /etc/shadow.

Объяснение см. в этом документе:
http://www.akkadia.org/drepper/SHA-crypt.txt

Здесь есть реализация этого на python:
http://packages.python.org/passlib/lib/passlib.hash.sha512_crypt.html

person MattH    schedule 05.04.2011

Я попал в ту же ловушку, поскольку все, что я читал, заставило меня поверить, что вы можете получить результаты так же, как вы их написали.

Я смог определить пароль, используя соль и пароль, используя crypt.crypt()

import crypt
crypt.crypt(password, salt)

соль: $6$Ii4CGbr7 пароль: usrpw123

точно не использует библиотеку hashlib, но она работает.

person iapplify    schedule 14.01.2014