在 python-pbkdf2 中验证 PBKDF2 密码哈希

问题描述 投票:0回答:2

我使用下面的代码片段在保存到数据库之前对用户密码进行加密。

from pbkdf2 import crypt
pwhash = crypt(password_from_user)

示例:

$p5k2$$Y0qfZ64u$A/pYO.3Mt9HstUtEEhWH/RXBg16EXDMr

然后,我将其保存在数据库中。在本地,我可以执行这样的检查:

from pbkdf2 import crypt
  pwhash = crypt("secret")
  alleged_pw = raw_input("Enter password: ")
  if pwhash == crypt(alleged_pw, pwhash):
      print "Password good"
  else:
      print "Invalid password"

但是我如何对数据库上的内容进行检查,因为加密的字符串并不总是相同的。我正在使用 python-pbkdf2

python encryption pbkdf2
2个回答
1
投票

好吧,做了更多研究并发现要实现这一点,我首先必须加密密码并保存在 db.as 中:

pwhash = crypt("secret",iterations=1000)

可以产生类似

$p5k2$3e8$her4h.6b$.p.OE5Gy4Nfgue4D5OKiEVWdvbxBovxm

的字符串

为了验证用户何时想使用相同的密码登录,我使用以下功能:

def isValidPassword(userPassword,hashKeyInDB):
     result = crypt(userPassword,hashKeyInDB,iterations = 1000)
     return reesult == hashKeyInDB #hashKeyInDB in this case is $p5k2$3e8$her4h.6b$.p.OE5Gy4Nfgue4D5OKiEVWdvbxBovxm

如果密码相同,此方法返回

True
,否则返回
False


0
投票

从 python 3.4 开始,您可以使用内置的

hashlib.pbkdf2_hmac
来生成/检查 pbkdf2 哈希值。以下是使用 PBKDF2 和 HMAC(sha1) 的示例:

from hashlib import pbkdf2_hmac
import os
iterations=10000
salt = os.urandom(8) # b'\xd0A,3?\xc5\xe7\xfd' / bytes.fromhex('d0412c333fc5e7fd')
hash = pbkdf2_hmac('sha1',b'secret', salt, iterations, dklen=64).hex()
print(f"pbkdf2:{iterations}:{salt.hex()}:{hash}")
# pbkdf2:10000:d0412c333fc5e7fd:85c5ed63e0a80dc314a3134098d6ecb2facba6a9572bd7795ca9213864ff14245e5ea2787f6af1f4835005a1daa0c555b2f3e9af8dbb3db4ac8ed99fa448503b
© www.soinside.com 2019 - 2024. All rights reserved.