如何使用函数在 sqlalchemy 查询中验证密码? 在
class PersonModel(Base):
__tablename__ = 'persons'
username = Column(String(30), nullable=False)
email = Column(String(75), nullable=False)
password = Column(String(128), nullable=False)
我使用来自 http://pythonhosted.org 的 sha256_crypt.encrypt("password_string")
存储密码/passlib/并且我可以使用 sha256_crypt.verify(password_to_check_against, hash)
( 试过了
person = session.query(PersonModel).filter(and_(PersonModel.username.like(username), PersonModel.password.like(sha256_crypt.encrypt(password_string)))).first()
但它不起作用 => sha256_crypt.encrypt(password_string) 生成的值与数据库中相同的密码不同,我不能仅使用 ==
运算符 sha256_crypt.verify
来自网站)
如何在我的查询中注入(inject)这个?
最佳答案
需要使用sha256_crypt.verify()
,不能在AND
子句中使用,因为它需要密码哈希字符串进行验证。
如果您查看此函数的输出示例,以及 documentation for "modular crypt format" :
$5$rounds=80000$zvpXD3gCkrt7tw.1$QqeTSolNHEfgryc5oMgiq1o8qCEAcmye3FoMSuvgToC
- 开头的
5
means sha256_crypt . rounds=80000
是散列的次数。$
之间的下一部分是盐。- 最后一节实际上是the digest output
所以它实际上需要所有前三个部分,加上纯文本密码以相同的方式对其进行哈希处理。
为此,首先获取您的用户信息:
person = session.query(PersonModel).filter(PersonModel.username.like(username)).first()
然后做验证:
is_authenticated = sha256_crypt.verify(password_string, person.password)
关于python - 如何使用函数在 sqlalchemy 查询中验证密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15978279/