6

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 のパスワードが一致しない正確な理由がわかったら、ここに投稿します。

4

2 に答える 2

7

次のスクリプトを使用してそのパスワードをハッシュすると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

予想されるハッシュが password に対応していると確信しています2bullsか?

于 2013-03-29T00:50:40.510 に答える
0

この目的のためにgemをリリースしました。私も @Daniel Aronne と同じ結果を得ます:

require 'pbkdf2_password_hasher'

puts Pbkdf2PasswordHasher::hash_password('2bulls','YsnGfP4rZ1IZ',10000,32)
#=> "YEfK6oUGFHdaKZMDXC0Dz8TpwsJlKfqC5vjCxjo+ldU="
于 2014-03-19T20:32:23.380 に答える