Flask-Bcrypt - flask-bcrypt-docs-zh 0.5 文档
Flask-Bcrypt是一个Flask扩展,它能为你的应用提供bcrypt散列功能。
欢迎批评指正。
Flask-Bcrypt
Flask-Bcrypt是一个Flask扩展,它为你的应用提供了bcrypt散列功能。
得益于近些年来计算机硬件(如GPU)性能的提升,散列技术已经变得很容易被攻破了。想要解决这个问题,一个积极的作法是使用一种“去优化”的散列技术。Bcrypt就是这样一个散列工具;不同于MD5和SHA1等在速度上优化的散列算法,bcrypt被有意地放慢了算法速度。
密码等敏感数据必须被保护起来,而bcrypt正是一个值得推荐的选择。
安装
安装该扩展需要如下命令::
$ easy_install flask-bcrypt
如果你已经安装了pip,可以选择以下这种方式::
$ pip install flask-bcrypt
注解
你需要Python Development Headers作为依赖来安装py-bcrypt包。如果你是在使用Mac OS或者Windows,你可能已经安装了它。如果你使用的不是这两者而是Linux,那你需要根据你的系统来寻找包。如果是基于Dabian的发行版,那就寻找名为python-dev的包;如果基于RedHat的发行版,那就寻找名为python-devel的包。
用法
想要通过扩展简单方便地导入已经包装好了类并且将flask应用传入进去。应该这样做::
from flask import Flask from flask.ext.bcrypt import Bcrypt app = Flask(__name__) bcrypt = Bcrypt(app)
两个基础的散列方法已经包含在了bcrypt对象中。在Python2中,可以这样使用它们::
pw_hash = bcrypt.generate_password_hash(‘hunter2‘) bcrypt.check_password_hash(pw_hash, ‘hunter2‘) # returns True
在python3中,你需要使用在generate_password_hash()上使用decode(‘utf-8’)方法,如下所示::
pw_hash = bcrypt.generate_password_hash(‘hunter2’).decode(‘utf-8’)
API
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应用对象。默认为空。
check_password_hash(pw_hash, password)
检查散列值与密码是否匹配。密码会被散列,然后在常数时间内与散列值进行比较。这个方法会返回True或者False。
check_password_hash的用法示例如下::
pw_hash = bcrypt.generate_password_hash(‘secret‘, 10) bcrypt.check_password_hash(pw_hash, ‘secret‘) # returns True
参数:
- pw_hash – 用来比较的散列值。
- password – 用来比较的密码。
generate_password_hash(password, rounds=None, prefix=None)
用bcrypt生成一个密码的散列值。指定rounds的值可以对bcrypt.gensalt()的参数log_rounds进行设定,可以用来决定盐的复杂程度,默认值为12。指定prefix的值可以对bcrypt.gensalt()的参数prefix进行高寒,可以决定生成散列值的算法的版本。
generate_password_hash的用法示例如下::
pw_hash = bcrypt.generate_password_hash(‘secret‘, 10)
参数:
- password – 用以散列的密码。
- rounds – 设定盐的复杂程度。
- prefix – 设定算法的版本。
init_app(app)
用扩展对应用进行初始化。
参数:
- app – Flask应用对象。
flask_bcrypt.generate_password_hash(password, rounds=None)
这个函数对Bcrypt的eponyous方法进行了包装,方便你使用。它期望被作为一个帮助函数,在已经配置好app的情况下使用。在其他情况下,这种非常方便的用法不会使用app对象。
对这个函数而言,简单地将它从模块中导入,并作为一个相似的方法使用是可行的。这里有一个简单的例子::
from flask.ext.bcrypt import generate_password_hash pw_hash = generate_password_hash(‘hunter2‘, 10)
参数:
- password - 用来散列的密码。
- ronuds - 盐的复杂程度。
flask_bcrypt.check_password_hash(pw_hash, password)
这个函数对Bcrypt的eponyous方法进行了包装,方便你使用。它期望被作为一个帮助函数,在已经配置好app的情况下使用。在其他情况下,这种非常方便的用法不会使用app对象。
对这个函数而言,简单地将它从模块中导入,并作为一个相似的方法使用是可行的。这里有一个简单的例子::
from flask.ext.bcrypt import check_password_hash check_password_hash(pw_hash, ‘hunter2‘) # returns True
参数:
- pw_hash – 用来比较的散列值。
- password – 用来比较的密码。