#python #md5 #salt #sha #sha512
#python #md5 #соль #sha #sha512
Вопрос:
Я пытаюсь понять, как Linux шифрует наш пароль в файле etc / shadow, поэтому у меня нет нового виртуального «тестового» пользователя, чтобы провести некоторый тест:
пользователь: новый пользователь
пароль: usrpw123
Сгенерированная соль: Ii4CGbr7
Итак, ОС создает для меня следующую строку в файле etc / shadow, используя систему шифрования SHA512 (6 долларов США): newuser:$6$Ii4CGbr7$IOua8/oPV79Yp.BwzpxlSHjmCvRfTomZ.bhEvjZV2x5qhrvk82lZVrEtWQQej2pOWMdN7hvKwNgvCXKFQm5CB/:15069:0:99999:7:::
Теперь я беру модуль SHA512 из python и пробую это:
import hashlib
m = hashlib.sha512()
m.update('Ii4CGbr7' 'usrpw123')
print m.hexdigest
В результате я получаю следующий хэш:
c73156daca3e31125ce457f1343201cc8a26400b2974440af2cc72687922b48b6631d21c186796ea2756ad987a996d2b261fe9ff3af4cc81e14c3029eac5df55
Как вы можете видеть, оно отличается от другого в файле / etc / shadow, и я не знаю почему, если я использую ту же соль пароль для генерации хэша.
Может ли кто-нибудь помочь мне и более или менее объяснить, почему это происходит?
А также, почему файлы /etc / shadow генерируют хэш с несколькими точками (.)?
Спасибо
Комментарии:
1. Обратите внимание, что шестнадцатиричный код включает только
[0-9a-f]
символы, в то время как строка вshadow
файле является[0-9a-zA-Z/.]
, поэтому форматы вывода изначально отличаются…2. SHA не является системой шифрования. SHA — это функция хеширования. Между ними большая разница.
Ответ №1:
Поля в /etc / shadow построены или интерпретированы не так, как вы думаете. Вы захотите прочитать справочную страницу для получения подробной информации, но наиболее очевидным отличием является то, что она использует необычную кодировку base64 как для соли, так и для хэша.
Комментарии:
1. Итак, знаете ли вы какой-либо код, который я могу использовать для эмуляции шифрования MD5 / SHA512 на Python? Я хотел бы создать функцию, которая выполняет тот же выход, что и в файле /etc / shadow. <br> Еще раз спасибо
2. @Borja: Для достижения этого буквально нужно перевести с C-кода на Python. Никого это не волнует, так как системную библиотеку можно вызвать непосредственно из Python. Возможно, кто-то написал библиотеку мостов, похожую на
crypt()
call.
Ответ №2:
Существует алгоритм генерации хэшей паролей, найденный в /etc/shadow.
Смотрите этот документ для объяснения:
http://www.akkadia.org/drepper/SHA-crypt.txt
Здесь есть реализация этого на python:
http://packages.python.org/passlib/lib/passlib.hash.sha512_crypt.html
Ответ №3:
Я попал в ту же ловушку, что и все, что я прочитал, заставило меня поверить, что вы могли бы получить результаты тем же способом, которым вы их написали.
Я смог определить пароль, используя соль и пароль, используя crypt.crypt()
import crypt
crypt.crypt(password, salt)
соль: $ 6 $ Ii4CGbr7
пароль: usrpw123
не совсем использует библиотеку hashlib, но она работает.