Проверка пароля Django в Ruby on Rails дает не совпадающий пароль



Я переписываю приложение Django в Ruby on Rails и хочу сохранить старые пароли для пользователей.



Django использует PBKDF2SHA1 в качестве механизма шифрования. Таким образом, один зашифрованный пароль у меня есть это



pbkdf2_sha256$10000$YsnGfP4rZ1IZ$Tpf4922MoNEjuJQA9EG2Elptyt3dMAyzBPUgmunFOW4=


Исходный пароль 2bulls



В Ruby я использую pbkdf256 gem и base64 для проверки.



Base64.encode64 PBKDF256.dk("2bulls", "YsnGfP4rZ1IZ", 10000, 32)


Я ожидаю



Tpf4922MoNEjuJQA9EG2Elptyt3dMAyzBPUgmunFOW4=


Однако я получил



YEfK6oUGFHdaKZMDXC0Dz8TpwsJlKfqC5vjCxjo+ldU=


Есть идеи?



Обновление



Нашел код в исходнике django, если он делает больше здравый смысл для тебя.



class PBKDF2PasswordHasher(BasePasswordHasher):
"""
Secure password hashing using the PBKDF2 algorithm (recommended)

Configured to use PBKDF2 + HMAC + SHA256 with 10000 iterations.
The result is a 64 byte binary string. Iterations may be changed
safely but you must rename the algorithm if you change SHA256.
"""
algorithm = "pbkdf2_sha256"
iterations = 10000
digest = hashlib.sha256

def encode(self, password, salt, iterations=None):
assert password
assert salt and '$' not in salt
if not iterations:
iterations = self.iterations
hash = pbkdf2(password, salt, iterations, digest=self.digest)
hash = base64.b64encode(hash).decode('ascii').strip()
return "%s$%d$%s$%s" % (self.algorithm, iterations, salt, hash)

def verify(self, password, encoded):
algorithm, iterations, salt, hash = encoded.split('$', 3)
assert algorithm == self.algorithm
encoded_2 = self.encode(password, salt, int(iterations))
return constant_time_compare(encoded, encoded_2)

def safe_summary(self, encoded):
algorithm, iterations, salt, hash = encoded.split('$', 3)
assert algorithm == self.algorithm
return SortedDict([
(_('algorithm'), algorithm),
(_('iterations'), iterations),
(_('salt'), mask_hash(salt)),
(_('hash'), mask_hash(hash)),
])


Вывод:



Оказывается, что только учетная запись с 2bulls, являющаяся паролем, имеет эту проблему. С остальными счетами все в порядке. Когда я узнаю точную причину несогласованного пароля для 2bulls, я опубликую здесь.

623   2  

2 ответов:

Если вы хэшируете этот пароль 2bulls, используя следующий скрипт (та же логика, что и у Django для хэширования паролей), это то, что вы получаете (запустили это в оболочке Django):

>>> import base64, hashlib
>>> hash = pbkdf2("2bulls","YsnGfP4rZ1IZ", 10000, 32, hashlib.sha256)
>>> hash.encode('base64').strip()
'YEfK6oUGFHdaKZMDXC0Dz8TpwsJlKfqC5vjCxjo+ldU='
Обратите внимание, что я использую те же параметры, что и вы в Ruby:
password = "2bulls"
salt = "YsnGfP4rZ1IZ"
iterations = 10000
dklen = 32
digest = hashlib.sha256

Вы уверены, что ваш ожидаемый хэш соответствует паролю 2bulls?

Я только что выпустил драгоценный камень для этой цели. Я тоже получаю тот же результат, что и @Daniel Aronne:

require 'pbkdf2_password_hasher'

puts Pbkdf2PasswordHasher::hash_password('2bulls','YsnGfP4rZ1IZ',10000,32)
#=> "YEfK6oUGFHdaKZMDXC0Dz8TpwsJlKfqC5vjCxjo+ldU="

Comments

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