如何在sqlalchemy查询中使用函数验证密码?

时间:2013-04-12 18:21:15

标签: python python-2.7 sqlalchemy

如何在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 / passlib /中的sha256_crypt.encrypt("password_string")来存储密码,我可以使用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)生成的值与db不同,我不能仅使用==运算符来自站点sha256_crypt.verify 如何在我的查询中注入此内容?

1 个答案:

答案 0 :(得分:5)

您需要使用sha256_crypt.verify(),而无法在AND子句中执行此操作,因为它需要密码哈希字符串进行验证。

如果您查看此函数的输出示例以及documentation for "modular crypt format"

  

$ 5 $轮= 80000 $ $ zvpXD3gCkrt7tw.1 QqeTSolNHEfgryc5oMgiq1o8qCEAcmye3FoMSuvgToC

  • 5开头的rounds=80000
  • $是多少次哈希。
  • person = session.query(PersonModel).filter(PersonModel.username.like(username)).first() ' s之间的下一部分是盐。
  • 最后一部分实际上是means sha256_crypt

所以它实际上需要前三个部分,加上纯文本密码以相同的方式散列它。

要执行此操作,请先获取用户的信息:

is_authenticated = sha256_crypt.verify(password_string, person.password)

然后进行验证:

{{1}}