密码散列

为了创建密码散列,我将会使用 PassLib 库,一个专门用于密码散列的 Python 包。

PassLib 提供了多种散列算法供选择。custom_app_context 是一个易于使用的基于 sha256_crypt 的散列算法。

User 用户模型需要增加两个新方法来增加密码散列和密码验证功能:

  1. from passlib.apps import custom_app_context as pwd_context
  2.  
  3. class User(db.Model):
  4. # ...
  5.  
  6. def hash_password(self, password):
  7. self.password_hash = pwd_context.encrypt(password)
  8.  
  9. def verify_password(self, password):
  10. return pwd_context.verify(password, self.password_hash)

hash_password() 函数接受一个明文的密码作为参数并且存储明文密码的散列。当一个新用户注册到服务器或者当用户修改密码的时候,这个函数将被调用。

verify_password() 函数接受一个明文的密码作为参数并且当密码正确的话返回 True 或者密码错误的话返回 False。这个函数当用户提供和需要验证凭证的时候调用。

你可能会问如果原始密码散列后如何验证原始密码的?

散列算法是单向函数,这就是意味着它们能够用于根据密码生成散列,但是无法根据生成的散列逆向猜测出原密码。然而这些算法是具有确定性的,给定相同的输入它们总会得到相同的输出。PassLib 所有需要做的就是验证密码,通过使用注册时候同一个函数散列密码并且同存储在数据库中的散列值进行比较。