2

使用: Python 3.2.3、scrypt 0.5.5 モジュール、Ubuntu 12.04

scrypt モジュールを正常にインストールしました。ページのサンプル コードを正常に実行しました。サンプルコードの拡張版も見つけましたが、これも問題ありませんでした。しかし、同じ単語を 2 回ハッシュするかどうかをテストしたかったので、Encrypt() へのセクション呼び出しを追加して、DB に対して 1 回ハッシュし、ユーザーがログインしたときに再度ハッシュするという概念をシミュレートしました。次のようになります。

import random,scrypt

class Encrypt(object):

    def __init__(self):
        pass

    def randSTR(self,length):
        return ''.join(chr(random.randint(0,255)) for i in range(length))

    def hashPWD(self,pwd, maxtime=0.5, datalength=64):
        return scrypt.encrypt(self.randSTR(datalength), pwd, maxtime=maxtime)

    def verifyPWD(self,hashed_password, guessed_password, maxtime=0.5):
        try:
            scrypt.decrypt(hashed_password, guessed_password, maxtime)
            return True
        except scrypt.error:
            return False

if __name__ == '__main__':
    e = Encrypt()
    user_pw = 'theansweris42'
    user_salt = 't9'
    pw_salt = user_pw + user_salt
    hashed_pw = e.hashPWD(pw_salt) # To be stored len()==192
    y = e.verifyPWD(hashed_pw, pw_salt)              # True
    n = e.verifyPWD(hashed_pw, 'guessing'+ pw_salt)  # False
    print(y)
    print(n)
    #print("Hash: %s" % (hashed_pw))

    x = Encrypt()
    user_pw2 = 'theansweris42'
    user_salt2 = 't9'
    pw_salt2 = user_pw2 + user_salt2
    hashed_pw2 = x.hashPWD(pw_salt2) # To be stored len()==192
    y2 = x.verifyPWD(hashed_pw, hashed_pw2)              # True
    print(y2)
    print(pw_salt)
    print(pw_salt2)
    print(hashed_pw)
    print(hashed_pw2)

...ご覧のとおり、salt も (テスト用に) ハードコーディングしました。奇妙なことに、これを実行するたびに、hashed_pw と hashed_pw2 が常に異なります。これが同じパスワードを毎回異なる方法でハッシュするのはなぜですか? まったく同じ入力を与えるたびに同じハッシュを出力するべきではありませんか? 私はこれを1時間理解しようとしてきたので、聞いたほうがいいと思います.

4

1 に答える 1