Ruby on Rails で Django アプリを書き直しており、ユーザーの古いパスワードを保持したいと考えています。
Django は、暗号化メカニズムとして PBKDF2SHA1 を使用します。だから私が持っている暗号化されたパスワードの1つはこれです
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 のパスワードが一致しない正確な理由がわかったら、ここに投稿します。