Присоединяйтесь ко мне в борьбе со слабыми хэшами пароля.
Хэш пароля PBKDF2 должен содержать соль, количество итераций и сам хеш, чтобы можно было позже проверить. Существует ли стандартный формат, например RFC2307 {SSHA}, для хэшей паролей PBKDF2? BCRYPT отлично, но PBKDF2 проще реализовать.
По-видимому, нет спецификации. Итак, вот моя спецификация.
>>> from base64 import urlsafe_b64encode
>>> password = u"hashy the \N{SNOWMAN}"
>>> salt = urlsafe_b64decode('s8MHhEQ78sM=')
>>> encoded = pbkdf2_hash(password, salt=salt)
>>> encoded
'{PBKDF2}1000$s8MHhEQ78sM=$hcKhCiW13OVhmLrbagdY-RwJvkA='
Обновление: http://www.dlitz.net/software/python-pbkdf2/ определяет замену crypt()
. Я обновил свою маленькую спецификацию, чтобы соответствовать ему, кроме его стартов с $p5k2$
вместо {PBKDF2}
. (Мне нужно перейти от других типов LDAP {SCHEMES}).
Это {PBKDF2}
, число итераций в нижнем регистре шестнадцатеричных, $
, urlsafe_base64
закодированная соль, $
и urlsafe_base64
закодированный вывод PBKDF2. Соль должна быть 64 бита, количество итераций должно быть не менее 1000, а выход PBKDF2 с выходом HMAC-SHA1 может быть любой длины. В моей реализации по умолчанию всегда 20 байтов (длина хэша SHA-1).
Пароль должен быть закодирован в utf-8 перед отправкой через PBKDF2. Нет слов о том, следует ли его нормализовать в Unicode NFC.
Эта схема должна быть порядка iterations
раз более дорогостоящей для грубой силы, чем {SSHA}.