【问题标题】:Python 3, Scrypt module, Hashes Not MatchingPython 3,Scrypt 模块,哈希不匹配
【发布时间】:2012-07-31 23:52:00
【问题描述】:

使用: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 总是不同的。为什么每次对相同的密码进行不同的哈希处理?每次我给它完全相同的输入时,它不应该输出相同的哈希吗?我已经想了一个小时,所以我想我最好问一下。

【问题讨论】:

    标签: ubuntu python-3.x scrypt


    【解决方案1】:

    您使用相同的密码(加上盐)加密了两个不同的随机字符串。这将导致两个不同的输出。

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

    【讨论】:

    • 我想我不明白什么。我对此有点陌生,所以如果我问的是“愚蠢”的问题,我深表歉意,但是......我如何加密两个不同的随机字符串?不是两次都对字符串 theansweris42t9 进行哈希处理吗?该字符串是pw_saltpw_salt2 的值,所以当我对它们进行哈希处理时,它应该输出相同的值,对吧?
    • 另外,我必须在数据库中存储一些东西(哈希密码和盐?),以便稍后在用户登录时进行比较,对吧?
    • @Zamphatta:不,您要加密的字符串是 self.randSTR(datalength)。是的,您需要存储哈希和盐。但是你不比较任何东西,你只是用密码和盐解密存储的哈希。
    • 哦,我现在明白了。哇,这和我想的完全不一样。我喜欢它!我在想我必须对密码和盐进行哈希处理,将其存储在数据库中,然后当用户登录时,我重新对密码和盐进行哈希处理,以便将其与数据库中存储的值进行比较。所以我开始感到困惑,我不明白。这就是我过去的做法,我认为这是唯一合乎逻辑的方式。我比以前更喜欢这种方式。谢谢伦纳特!
    猜你喜欢
    • 1970-01-01
    • 2020-01-27
    • 2021-04-23
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2018-11-30
    相关资源
    最近更新 更多