0

我使用 Python 和 Flask 创建了包含姓名、电子邮件、密码和确认密码字段的注册页面。为了以加密格式将密码存储在数据库中,我选择了passlib。根据文档,我已经达到了此代码不起作用的地步:

        name = request.form['name']
        email = request.form['email']
        password = pbkdf2_sha256.hash(str(request.form['pass']))
        confirm = pbkdf2_sha256.hash(str(request.form['confirm']))
        if password == confirm:
            cur = mysql.connection.cursor()
            cur.execute("INSERT INTO users(name, email, password) VALUES(%s, %s, %s)", (name, email, password))
            mysql.connection.commit()

但这有效

        name = request.form['name']
        email = request.form['email']
        password = pbkdf2_sha256.hash(str(request.form['pass']))
        confirm = request.form['confirm']
        if pbkdf2_sha256.verify(confirm, password):
            cur = mysql.connection.cursor()
            cur.execute("INSERT INTO users(name, email, password) VALUES(%s, %s, %s)", (name, email, password))
            mysql.connection.commit()

虽然我不确定这是否是正确的方法。我会很感激一些建议。

4

1 回答 1

0

该库生成密码的加盐哈希,因此对于相同的输入,每次输出都会不同:

> pbkdf2_sha256.hash('password')
'$pbkdf2-sha256$29000$1pozZkyJUQrB.D.nNAYAwA$Vg8AJWGDIv2LxOUc7Xkx/rTfuaWnxqzlOC30p11KKxQ'

> pbkdf2_sha256.hash('password')
'$pbkdf2-sha256$29000$aa31XmttTek9p5Rybo3Rug$FCaAMh.T6g5FM76XD3omh3rcQgGpAiLzeqRl0wg4E.A'

所以,直接比较是行不通的。另一方面,由于盐存储在输出中,函数verify可以重新使用它来生成相同的散列并比较结果。

于 2019-11-18T07:03:23.947 回答