Python 3,Scrypt模块,哈希不匹配

时间:2012-08-02 23:11:20

标签: ubuntu python-3.x scrypt

使用:Python 3.2.3,scrypt 0.5.5模块,Ubuntu 12.04

我安装了scrypt模块。我在页面上运行了示例代码。我还找到了expanded version of the sample code,也做得很好。但我想测试它是否会将相同的单词哈希两次,所以我添加了一个段调用Encrypt(),模拟为数据库散列一次的概念,然后在用户登录时再次进行散列,所以我的完整代码看起来像这样:

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)

......正如你所看到的,我还对盐进行了硬编码(用于测试)。奇怪的是,每次我运行它,hashed_pw& hashed_pw2总是不同的。为什么每次以不同的方式散列相同的密码?每次我给它完全相同的输入时,它不应该输出相同的哈希值吗?我一直试图弄清楚这一小时,所以我想我最好问。

1 个答案:

答案 0 :(得分:0)

使用相同的密码(加上盐)加密两个不同的随机字符串。这将产生两种不同的输出。

这里使用的技巧是密码+ salt可用于解密该随机字符串,而错误的密码将引发错误。因此,您不需要存储原始随机字符串以确保密码正确,并且由于使用的字符串是随机的(在随机数生成器的限制范围内),因此破解密码将非常困难。