Хеширование в SHA512 с помощью соли? - питон - PullRequest
36 голосов
/ 24 мая 2010

Я просматривал документацию по hashlib, но ничего не говорил об использовании salt при hash data.

Справка была бы отличной.

Ответы [ 6 ]

71 голосов
/ 24 мая 2010

Самир ответ правильный, но несколько загадочный.По сути, соль - это просто случайный бит данных, который вы добавляете или префиксируете к своим данным, чтобы значительно увеличить сложность атаки по словарю на ваше хэшированное значение.Таким образом, учитывая соль s и данные d, вы просто сделаете следующее, чтобы сгенерировать соленый хеш данных:

import hashlib
hashlib.sha512( s + d ).hexdigest()

См. статью в Википедии для получения более подробной информации.

17 голосов
/ 24 мая 2010

Просто добавьте соль к вашим конфиденциальным данным:

>>> import hashlib
>>> m = hashlib.sha512()
>>> m.update('salt')
>>> m.update('sensitive data')
>>> m.hexdigest()
'70197a4d3a5cd29b62d4239007b1c5c3c0009d42d190308fd855fc459b107f40a03bd427cb6d87de18911f21ae9fdfc24dadb0163741559719669c7668d7d587'
>>> n = hashlib.sha512()
>>> n.update('%ssensitive data' % 'salt')
>>> n.hexdigest()
'70197a4d3a5cd29b62d4239007b1c5c3c0009d42d190308fd855fc459b107f40a03bd427cb6d87de18911f21ae9fdfc24dadb0163741559719669c7668d7d587'
>>> hashlib.sha512('salt' + 'sensitive data').hexdigest()
'70197a4d3a5cd29b62d4239007b1c5c3c0009d42d190308fd855fc459b107f40a03bd427cb6d87de18911f21ae9fdfc24dadb0163741559719669c7668d7d587'
8 голосов
/ 24 мая 2010

Соление - это не волшебный процесс, который необходим библиотеке, а просто дополнительные данные, которые не дают работать радужным таблицам.

>>> import hashlib
>>> m = hashlib.sha512()
>>> m.update(b"Nobody inspects")
>>> m.update(b" the spammish repetition")
>>> m.digest()
b'\xd0\xf4\xc1LH\xadH7\x90^\xa7R\x0c\xc4\xafp\x0fd3\xce\t\x85\xe6\xbb\x87\xb6\xb4a|\xb9D\xab\xf8\x14\xbdS\x96M\xdb\xf5[A\xe5\x81+:\xfe\x90\x89\x0c\nM\xb7\\\xb0Cg\xe19\xfdb\xea\xb2\xe1'
>>> m.update(b"My super-secret salt.")
>>> m.digest()
b'\xcd\xd7K\xd9!~\xa8\x1d6\x9b\xa6\xde\x06\t\x02\xa1+}\xaeNA\x94a`\xaa\xf4\xe9\xb5\xff\x1f\x9cE\x84m\xbb\x98U\xb4z\x92\x9e\xe8\xc9\xc2\xc8\x8f\x068e\xb0\r\xed\xb7\xde\x80\xa6,\n\x111w{\xa2\x9b'
7 голосов
/ 24 мая 2010

Если вы ищете замену crypt (), в более новых версиях glibc есть основанный на SHA-512 «$ 6 $» с переменным количеством итераций (см. страница Ульриха Дреппера , в которой естьописание и ссылки на полную реализацию C * sha512_crypt_r()).

Написание собственного криптографического кода крайне нежелательно - вышеприведенный sha512(salt+password) не помогает против атаки методом перебора.

Для генерации соли используйте что-то вроде os.urandom(16) для случайных байтов или ''.join(map(lambda x:'./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'[ord(x)%64], os.urandom(16))) для случайных base64-подобных символов (для использования с crypt () - alikes).

(я говорю base64-alike, это не то же самоекак Base64 в PEM / MIME.)

3 голосов
/ 14 марта 2013

используйте passlib, написание собственного пароля - это почти верный путь к провалу.

2 голосов
/ 14 ноября 2013

SHA512 - не лучший способ хранить хешированные пароли в наши дни. Вы должны использовать bcrypt или что-то подобное. Важно то, что засолка встроена и что алгоритм имеет значительный рабочий фактор.

Если вы солите свои пароли SHA512, просто добавляя (или добавляя) соль к открытому тексту, любой, кто получит в руки набор ваших хешированных паролей и применяет современный инструмент взлома (http://arstechnica.com/security/2013/05/how-crackers-make-minced-meat-out-of-your-passwords/), сможет чтобы увидеть сцепленные значения «пароль + соль» и, возможно, благодаря простому сопоставлению с образцом сможет отделить часть пароля от части «соль» для большинства, если не для всех учетных записей, о которых идет речь.

Я не думал об этом до конца, и я ни в коем случае не эксперт по безопасности, но мне кажется, что если вы зашифруете (используя, например, AES256) пароль, используя соль как ключ, а затем хэш , что с SHA512, вы будете в безопасности от уязвимости, которую я описал выше.

Однако в этот момент вы приложили больше усилий, чем потребовалось бы для перехода на bcrypt, и у вас все равно не было бы защиты рабочего фактора, поэтому я бы рекомендовал такой подход только в том случае, если среда вы работаете в не предлагает эту опцию.

...