bcrypt和pbkdf2的密码散列框架。
项目描述
负责任地散列密码
from cryptacular.bcrypt import BCRYPTPasswordManager manager = BCRYPTPasswordManager() hashed = manager.encode('password') if manager.check(hashed, 'password'): pass # let them in
cryptacular是一组强大的密码散列函数集合,它们具有共同的接口,并且以优雅的方式使用bcrypt作为密码散列。它旨在使您能够轻松地从您半吊子的自定义密码方案迁移出来。与纯文本或md5或sha的单轮散列等流行选择相比,强密码散列可以大大增加从泄露的密码数据库中获取用户密码的计算成本。
cryptacular的接口灵感来源于zope.password,但cryptacular不依赖于zope并且实现了更强大的算法。cryptacular还提供了一种方便的方法,在用户使用正确的密码登录时,可以动态识别和升级过时的密码散列。
z3c.bcrypt将cryptacular集成到zope.password中。
http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-to-know-about-s.html解释了为什么bcrypt是个好主意。现在计算机很快。为了保护我们的用户免受泄露的密码数据库的侵害,我们应该使用检查时间比sha1(salt + hash)稍长的密码散列。bcrypt和pbkdf2具有这种属性。它们还具有参数化复杂性,因此可以随着计算机继续变快而变得更强大。
cryptacular附带100%的测试覆盖率。
cryptacular.core
cryptacular.core 定义了 DelegatingPasswordManager 以及接口(抽象基类)PasswordChecker 和 PasswordManager。
DelegatingPasswordManager 是推荐使用 cryptacular 的方式。DelegatingPasswordManager 持有一个首选的 cryptacular.core.PasswordManager 实例,它可以编码和检查密码散列,以及一个回退的 cryptacular.core.PasswordChecker 实例列表,这些实例只需要能够检查密码散列(无需实现 InsecurePasswordHash.encode())。当被要求检查密码散列与明文密码时,DelegatingPasswordManager 会找到其列表中第一个理解给定散列格式的项目,并使用它来检查密码。如果密码正确但不在首选散列格式中,DelegatingPasswordManager 将使用其首选的 PasswordManager 重新散列给定的密码。
>>> import cryptacular.core >>> import cryptacular.bcrypt >>> import cryptacular.pbkdf2 >>> bcrypt = cryptacular.bcrypt.BCRYPTPasswordManager() >>> pbkdf2 = cryptacular.pbkdf2.PBKDF2PasswordManager() >>> delegator = cryptacular.core.DelegatingPasswordManager(preferred=bcrypt, fallbacks=(pbkdf2,)) >>> users = {'one':{'password':'xyzzy'}, 'two':{'password':u'hashy the \N{SNOWMAN}'}} >>> for key in users: users[key]['hash'] = pbkdf2.encode(users[key]['password']) >>> bcrypt.match(users['one']['password']) False >>> def set_hash(hash): users['one']['hash'] = hash >>> delegator.check(users['one']['hash'], users['one']['password'], setter=set_hash) True >>> bcrypt.match(users['one']['hash']) True >>> def set_hash(hash): raise Exception("Should not re-set a preferred hash") >>> delegator.check(users['one']['hash'], users['one']['password'], setter=set_hash) True >>> bcrypt.match(users['two']['hash']) False >>> pbkdf2.match(users['two']['hash']) True >>> delegator.check(users['two']['hash'], users['two']['password']) True >>> bcrypt.match(users['two']['hash']) False >>> pbkdf2.match(users['two']['hash']) True
cryptacular.bcrypt
cryptacular.bcrypt 使用一个 C 扩展模块来调用公共领域的 crypt_blowfish (http://www.openwall.com/crypt/),该模块与 cryptacular 一起打包。如果您可以使用它,则应使用此功能。
cryptacular.pbkdf2
cryptacular.pbkdf2 将 RFC 2898 中描述的 pbkdf2 密钥派生算法用作密码散列。当 M2Crypto 不可用时,它使用 M2Crypto.EVP.pbkdf2 与 Python 回退。即使您不能在 Python 中运行 C 扩展模块,您也可以使用此功能。
cryptacular.crypt
cryptacular.crypt 使用 Python 内置的 crypt 模块,在 Unix 上可用于散列密码。它接受一个字符串,如 '1$',作为参数,以确定底层 crypt() 函数将生成哪种散列类型(有关详细信息,请参阅 man crypt)。如果幸运的话,crypt() 还可以提供 bcrypt 散列;为 RedHat 发明的 SHA 散列也很好。
在我的 Ubuntu 系统上
from cryptacular.crypt import CRYPTPasswordManager, SHA256CRYPT manager = CRYPTPasswordManager(SHA256CRYPT) manager.encode('secret') >>> '$5$Ka9M/5GqJWMCnLI7$ZR0k9g2NlnXvgjjDYmobVUuLzfn/Tmo.vnW4WvW5Tx/' manager.encode('secret') >>> '$5$o4RUq2zuVWYWZpuq$35VyAVxfeL4sQ9//ODNw8jIDW7khJ5s0lUlXCHJ6WZ2'
项目详细信息
cryptacular-1.6.2.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 7b529cb2b8a3c7e5be77921bf1ebc653d4d3a8f791375cc6f971b20db2404176 |
|
MD5 | 01d5a0b5267b7f0adb84b861ae334952 |
|
BLAKE2b-256 | 426934d478310d6c4451e5ddeabe879b28cc304173e0301b3568eca88ec65112 |