class flask_bcrypt.Bcrypt(app=None)¶
Bcrypt是用来对密码进行散列并检查逻辑的类容器。这个类或许会用来初始化你的flask app对象。这个类的作用是提供一个简单的接口,以重写Werkzeug自带的密码散列功能。
尽管这些方法事实上并没有重写,但API是有意设计得很相似,这可以使那些之前已经使用了散列函数的应用很容易地改写为拥有强大能力的bcrypt。
想要开始使用bcrypt,你可以对你的应用进行如下包装::
app = Flask(__name__)
bcrypt = Bcrypt(app)
现在两个基础的功能函数通过bcrypt已经包含在了app对象中。之后,在应用的上下文(context)中,重要数据(如密码等),可以通过以下操作进行散列::
password = 'hunter2'
pw_hash = bcrypt.generate_password_hash(password)
一旦被散列,值是不可逆的。然而,在一些需要确认密码、将两次输入的密码的散列值进行比较的场景下,非常有必要在常数时间(译者注:big-O(n))处理完成。这可以防止时序攻击(timing attacks)。bcrypt提供了一个简单的方法,如下所示::
candidate = 'secret'
bcrypt.check_password_hash(pw_hash, candidate)
如果两个密码一致,check_password_hash方法会返回True。如果不一致,返回False。
注解
命名空间的问题
如果你使用bcrypt的形式是bcrypt = Bcrypt(app),需要注意这个问题。你实际上重写了bcrypt模块。尽管你未必会需要操作已经跨出扩展范围的模块,但你应该意识到模块已经被重写了。
或者你可以考虑使用一个不同的名字来避免命名冲突,如flask_bcrypt = Bcrypt(app)。
BCRYPT_LOG_ROUNDS选项可以在flask应用中进行配置,这个值会决定encryption的复杂程度,默认值为12。(详情见bcrypt。)
BCRYPT_HASH_PREFIX选项可以在flask应用中进行配置,这个值可对散列版本进行设定,默认值为2b。(详情见bcrypt。)
bcrypt算法中,密码的默认长度为72位,超出了72位的部分将被忽略。如果散列一个给定的密码,常见的解决方案会使用散列技术(如sha256)中的hexdigest方法来规避没有位的问题,之后使用bcrypt对结果进行散列。如果BCRYPT_HANDLE_LONG_PASSWORDS的值被设定为True,那么上述的解决方案将无法使用。警告:不要在一个已经使用了flask-bcrypt的项目中将此选项设定为True,否则你将会使密码查验的功能无法使用。警告:如果在一个已存在的项目中,此选项已经被设定为True,但你却将它又更改为False,密码查验的功能将无法使用。
参数:
- app – flask应用对象。默认为空。