使用bcrypt或pbkdf2编码的密码管理器实用程序。与zope.password结合使用时很有用
z3c.bcrypt的Python项目详细描述
z3c.bcrypt
警告
z3c.bcrypt已被新版本的 zope.password因为它现在包括基于 维护良好的bcrypt库。请不要用 新项目中的这个包。
z3c.bcrypt提供与zope.password兼容的“密码管理器”实用程序 使用bcrypt(或者pbkdf2)编码来存储密码的。
这两种编码方案都在cryptacular库中实现,即 此包的依赖项。
使用z3c.bcrypt
>>> from zope.interface.verify import verifyObject >>> from zope.password.interfaces import IPasswordManager >>> from z3c.bcrypt import BcryptPasswordManager >>> manager = BcryptPasswordManager() >>> verifyObject(IPasswordManager, manager) True>>> password = u"right \N{CYRILLIC CAPITAL LETTER A}">>> encoded = manager.encodePassword(password) >>> encoded '$2a$...' >>> manager.checkPassword(encoded, password) True >>> manager.checkPassword(encoded, password + u"wrong") False>>> from z3c.bcrypt import PBKDF2PasswordManager >>> manager = PBKDF2PasswordManager() >>> verifyObject(IPasswordManager, manager) True>>> encoded = manager.encodePassword(password) >>> encoded u'$p5k2$...' >>> manager.checkPassword(encoded, password) True >>> manager.checkPassword(encoded, password + u"wrong") False>>> # A previously encoded password, should be decodable even if the >>> # current encoding of the same password is different:: >>> previouslyencoded = ( ... '$p5k2$1000$LgAFPIlc9CgrlSaxHyTUMA=' ... '=$IuUYplhMkR4qCl8-ONRVjEgJNwE=') >>> encoded == previouslyencoded False >>> manager.checkPassword(previouslyencoded , password) True
过长的“密码”将占用大量的计算时间 可用作DoS攻击向量。z3c.bcrypt中的密码管理器将 只使用输入密码的前4096个字符进行检查。
灵感来源:
https://www.djangoproject.com/weblog/2013/sep/15/security/
如果4096长度限制 没有到位。如何可靠地测试?
>>> incomming = '$p5k2$1000$' + 'a' * 1024 * 1024 * 100 # lot of data. >>> manager.checkPassword(encoded, incomming) False
配置
此软件包提供一个configure.zcml,用于安装 IPasswordManager作为实用程序的实现:
>>> from zope.configuration import xmlconfig >>> _ = xmlconfig.string(""" ... <configure ... xmlns="http://namespaces.zope.org/zope"> ... ... <include package="z3c.bcrypt" /> ... </configure> ... """)>>> from zope import component >>> from zope.password.interfaces import IPasswordManager >>> component.getUtility(IPasswordManager, name='bcrypt') <z3c.bcrypt.passwordmanager.BcryptPasswordManager object at ...> >>> component.getUtility(IPasswordManager, name='pbkdf2') <z3c.bcrypt.passwordmanager.PBKDF2PasswordManager object at ...>
z3c.bcrypt的变更日志
2.0.1(2018-08-01)
- 不赞成使用包而赞成使用zope.password。
2.0.0(2017-05-10)
- 标准化命名空间初始化。
- 添加对python 3.4、3.5、3.6和pypy的支持。
1.2(2013-10-10)
只验证密码的前4096个字符以防止 通过重复提交大型 密码,在昂贵的计算中占用服务器资源 相应散列的。
见:https://www.djangoproject.com/weblog/2013/sep/15/security/
1.1(2010-02-22)
- 在configure.zcml中修复。
1.0(2010-02-18)
- 首次公开发行。