Соль и хэш пароль в python



этот код должен хэшировать пароль с солью. Соль и хэшированный пароль сохраняются в базе данных. Самого пароля нет.





Примечание: я использую url-адрес безопасной версии b64encode по привычке.



import hashlib
import base64
import uuid

password = 'test_password'
salt = base64.urlsafe_b64encode(uuid.uuid4().bytes)


t_sha = hashlib.sha512()
t_sha.update(password+salt)
hashed_password = base64.urlsafe_b64encode(t_sha.digest())
997   6  

6 ответов:

EDIT: этот ответ неправильный. Не используйте криптографический хэш для хранения паролей. Используйте хэш пароля.


выглядит нормально для меня. Тем не менее, я уверен, что вам на самом деле не нужен base64. Вы могли бы просто сделать это:

import hashlib, uuid
salt = uuid.uuid4().hex
hashed_password = hashlib.sha512(password + salt).hexdigest()

если это не создает трудностей, вы можете получить немного более эффективное хранилище в своей базе данных, сохранив соль и хэшированный пароль в виде необработанных байтов, а не шестнадцатеричных строк. Для этого замените hex С bytes и hexdigest С digest.

умная вещь - не писать крипто самостоятельно, а использовать что-то вроде passlib:https://bitbucket.org/ecollins/passlib/wiki/Home

легко испортить написание вашего крипто кода безопасным способом. Ужасно то, что с номера код крипто часто сразу заметит его, когда он не работает, поскольку ваша программа аварийно завершает работу. В то время как с крипто кодом вы часто узнаете только после того, как это поздно, и ваши данные были скомпрометированы. Поэтому я думаю, что это лучше использовать пакет, написанный кем-то другим, кто хорошо осведомлен о предмете и который основан на проверенных протоколах битвы.

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

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

основываясь на других ответах на этот вопрос, я реализовал новый подход с использованием bcrypt.

зачем использовать bcrypt

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

# The '12' is the number the dictates the 'slowness'
bcrypt.hashpw(password, bcrypt.gensalt( 12 ))

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

реализация

def get_hashed_password(plain_text_password):
    # Hash a password for the first time
    #   (Using bcrypt, the salt is saved into the hash itself)
    return bcrypt.hashpw(plain_text_password, bcrypt.gensalt())

def check_password(plain_text_password, hashed_password):
    # Check hased password. Useing bcrypt, the salt is saved into the hash itself
    return bcrypt.checkpw(plain_text_password, hashed_password)

Примечания

я смог установить библиотеку довольно легко в системе linux с помощью:

pip install py-bcrypt

тем не менее, у меня было больше проблем с установкой его на моих системах windows. Похоже, ему нужен патч. Смотрите этот вопрос Stackoverflow:py-bcrypt установка на win 7 64bit python

для этого, чтобы работать в Python 3 вам нужно будет кодировать UTF-8 например:

hashed_password = hashlib.sha512(password.encode('utf-8') + salt.encode('utf-8')).hexdigest()

в противном случае вы получите:

обратная трассировка (самый недавний призыв последнего):
Файл "", строка 1, в
hashed_password = hashlib.sha512 (пароль + соль).hexdigest()
TypeError: Unicode-объекты должны быть закодированы перед хэшированием

passlib кажется полезным, если вам нужно использовать хэши, хранящиеся в существующей системе. Если у вас есть контроль над форматом, используйте современный хэш, такой как bcrypt или scrypt. На этот раз, осуществляется, кажется, гораздо проще использовать из Python.

passlib поддерживает bcrypt, и он рекомендует установить py-bcrypt в качестве бэкэнда:http://pythonhosted.org/passlib/lib/passlib.hash.bcrypt.html

вы также можете использовать py-bcrypt напрямую, если вы не хотите для установки passlib. В readme есть примеры базового использования.

Читайте также: как использовать scrypt для генерации хэша для пароля и соли в Python

Я не хочу воскрешать старую нить, но... любой, кто хочет использовать современное современное безопасное решение, используйте argon2.

https://pypi.python.org/pypi/argon2_cffi

Он выиграл конкурс хэширования паролей. ( https://password-hashing.net/) это проще в использовании, чем bcrypt, и это более безопасно, чем bcrypt.

Comments

    Ничего не найдено.