Python 如何使用bcrypt比较纯文本密码和散列密码?

Python 如何使用bcrypt比较纯文本密码和散列密码?,python,bcrypt,Python,Bcrypt,我想使用bcrypt散列密码,然后验证提供的密码是否正确 哈希密码很容易: import bcrypt password = u'foobar' password_hashed = bcrypt.hashpw(password, bcrypt.gensalt()) # then store password_hashed in a database 如何将纯文本密码与存储的哈希进行比较?稍后,假设您有一个用户输入密码user\u pass。您还需要对其进行散列,然后将散列与存储的散列进行比

我想使用
bcrypt
散列密码,然后验证提供的密码是否正确

哈希密码很容易:

import bcrypt

password = u'foobar'
password_hashed = bcrypt.hashpw(password, bcrypt.gensalt())

# then store password_hashed in a database

如何将纯文本密码与存储的哈希进行比较?

稍后,假设您有一个用户输入密码
user\u pass
。您还需要对其进行散列,然后将散列与存储的散列进行比较,如果它们匹配,则原始密码也匹配

请注意,bcrypt会自动将salt值存储为散列密码的一部分,以便在对将来的输入进行散列时也可以使用它

第一次:

import bcrypt

password = u'foobar'
salt = bcrypt.gensalt()
password_hashed = bcrypt.hashpw(password, salt)

# store 'password_hashed' in a database of your choosing
后来:

import bcrypt
password = something_that_gets_input()

stored_hash = something_that_gets_this_from_the_db()

if bcrypt.hashpw(password, stored_hash) == stored_hash:
    # password matches

文件中没有提到盐的储存,只是说你必须:

#Initial generation
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
#Store hashed in your db

#Load hashed from the db and check the provided password
if bcrypt.hashpw(password, hashed) == hashed:
    print "It matches"
else:
    print "It does not match"

使用py-bcrypt,您不需要单独存储盐:
bcrypt
将盐存储在散列中

您可以简单地将散列用作盐,盐存储在散列的开头

>>> import bcrypt
>>> salt = bcrypt.gensalt()
>>> hashed = bcrypt.hashpw('secret', salt)
>>> hashed.find(salt)
0
>>> hashed == bcrypt.hashpw('secret', hashed)
True
>>>

我不熟悉Python,但我认为您可以使用:


我认为这个会更好:

for i in range(len(rserver.keys())):
    salt = bcrypt.gensalt(12)
    
    mdp_hash = rserver.get(rserver.keys()[i])
    rserver.set(rserver.keys()[i], bcrypt.hashpw(mdp_hash.encode(),bcrypt.gensalt(12) ))

    rsalt.set(rserver.keys()[i], salt)

非常感谢。作为一个新手,我完全忽略了一个事实,即salt和密码需要存储并随后进行比较。谢谢你!使用bcrypt时无需储存盐。下面的答案是正确的。每次调用bcrypt.gensalt()时都会生成一个新的salt,因此您必须将salt与bcrypt.hashpw()的结果一起保存。@skyler-使用bcrypt,salt作为哈希的一部分存储。它被保存到哈希中,并自动将哈希与之进行比较。将哈希与
==
进行比较会带来安全问题(定时攻击)。您应该使用
hmac.compare_digest
。答案很好,但仅供参考,
hash
是Python 2和3的保留关键字(builtin func),设置
hash=…
将覆盖您所在范围内的内置关键字。我会把它改成散列的,或者是散列的,等等,我同意。这个
散列
必须用其他名称替换:)。不要忘记对字符串进行编码,
'secret'。encode()
。注意:在Python 3.+1中测试
checkpw()
,但不要忘记使用
encode('utf-8')
或在生成或检查密码之前对纯文本进行哈希运算时使用的任何编码
for i in range(len(rserver.keys())):
    salt = bcrypt.gensalt(12)
    
    mdp_hash = rserver.get(rserver.keys()[i])
    rserver.set(rserver.keys()[i], bcrypt.hashpw(mdp_hash.encode(),bcrypt.gensalt(12) ))

    rsalt.set(rserver.keys()[i], salt)