Moodle сохраняет хешированные пароли в таблице пользователей в следующем формате:
If the stored password is:
$2y$10$UB6vKrpw227eqVXj2PiPou9c0eRtxsdU02fo9.wc3VtsA2FI.gS6a
then:$2y$= the id of the hashing algorithm used (crypt_blowfish), enclosed in dollar signs.10$= the cost of using that algorithm (two digits) followed by a dollar sign.UB6vKrpw227eqVXj2PiPou= randomly generated secure salt (22 characters).9c0eRtxsdU02fo9.wc3VtsA2FI.gS6a= the hash (31 characters).
У меня простой текстовый пароль. Я не могу понять, как это проверить с помощью Python.






Это просто делается с помощью bcrypt:
pip install bcrypt
Тогда остается лишь вызвать функцию checkpw():
import bcrypt
hashed = b'$2y$10$UB6vKrpw227eqVXj2PiPou9c0eRtxsdU02fo9.wc3VtsA2FI.gS6a'
password = input('Enter password:').encode()
if bcrypt.checkpw(password, hashed):
print('Correct password entered!')
else:
print('Password is wrong!')
Обратите внимание, что bcrypt работает с байтами, а не со строками, поэтому пользовательский ввод должен выполняться через .encode().
а также запустив код, я получаю ошибку ValueError: Invalid hashed_password salt
@sphoenix Нет, согласно pypi.org/project/bcrypt, это должен быть pip install bcrypt. Однако я не пробовал с тех пор, как установил его с помощью anaconda. Странно, что вы получаете такую ошибку. Он отлично работает для меня. Какую версию python и какие версии bcrypt (bcrypt.__version__) вы используете?
@sphoenix А что вы имеете в виду под "hashed статичен"? Это объект bytes, скорее всего, вы получите его, просмотрев значение с именем пользователя в качестве ключа.
python 3.5.2, bcrypt: 3.1.4@sphoenix И вы получаете эту ошибку, когда копируете и вставляете код, который я предоставил? Это странно, поскольку в моей системе он, кажется, работает так же, как и должен. Однако, поскольку мы не знаем первоначального пароля, трудно увидеть, правильно ли он вычислен.
Да, я скопировал и вставил и получил ошибку! Странный!
Скажем, у нас много паролей. Можем ли мы использовать ваш метод для всех паролей?
@sphoenix У каждого пользователя, скорее всего, будет только один пароль, поэтому обычно вы храните каждый хешированный пароль в таблице поиска и используете имя пользователя (или другой тип идентификации, например, адрес электронной почты) в качестве ключа к таблице. То есть, когда вы знаете, какой пользователь хочет войти в систему, у вас будет только один пароль для проверки.
Разве это не
pip install py-bcrypt, да иhashedкажется статичным.