将PHP的crypt()散列迁移到Python
我在想,Python有没有类似于PHP的crypt()
函数的东西,它的功能也差不多,可以生成随机的盐值并把它嵌入到保存的字符串里。
我有一个存储了哈希密码的表,这些密码是用$5$
这个字符串作为密钥,设置了基于SHA256的加盐密码。 这些哈希值在两端还附加了一些额外的熵(随机性),不过把这些字符从字符串中分离出来,得到核心哈希值其实很简单,根本不是问题。
我查阅了Python的文档,但在hashlib
里找不到任何方法,能用上PHP的crypt()
那种语法。PHP里用的那种方法(输入格式中用美元符号分隔盐值、算法和轮数)是这个语言特有的吗?
谢谢。
编辑:
看起来Python自己原生的crypt
函数的改进版本将会使用类似于PHP的处理方式。从3.3版本的预发布文档来看:
http://docs.python.org/dev/library/crypt.html
编辑:
我终于找到了Passlib,这是一个提供这种功能的纯Python库。
2 个回答
我知道这个问题有点老了,不过我在尝试把一个用PHP写的登录算法转到Python时找到了这个内容。PHP里的crypt函数使用了一些不太安全的DES算法,包括bcrypt。具体使用哪种算法取决于你用来加密字符串的方法。Passlib是个不错的选择,可以帮助你在Python中实现PHP crypt的功能。你可以拿一个已经加密的密码,看看字符串的开头。你应该能看到像$2a$、$3$、$6$这样的东西。如果没有这些前缀,说明你可能在用标准的DES加密。
接下来,可以去这个链接看看:
http://pythonhosted.org/passlib/modular_crypt_format.html#mcf-identifiers
然后,把这些信息和你在Python中需要实现的算法对照一下。链接里的Scheme标识符会指向passlib文档,里面有关于这些加密算法的详细信息。到这一步,你应该就有足够的信息来完成你的重写工作了。
这看起来确实和FreeBSD的crypt很相似(可以在手册中查看“modular crypt”)。我不太记得在Linux或其他系统中是否也是这样,但这似乎说明它并不是独一无二的。
据我所知,Python中没有直接对应的东西,但自己实现一个应该不难,因为加密算法本身在hashlib
中是可以支持的。