将PHP的crypt()散列迁移到Python

3 投票
2 回答
1237 浏览
提问于 2025-04-17 07:16

我在想,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库。

http://packages.python.org/passlib/index.html

2 个回答

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文档,里面有关于这些加密算法的详细信息。到这一步,你应该就有足够的信息来完成你的重写工作了。

1

这看起来确实和FreeBSD的crypt很相似(可以在手册中查看“modular crypt”)。我不太记得在Linux或其他系统中是否也是这样,但这似乎说明它并不是独一无二的。

据我所知,Python中没有直接对应的东西,但自己实现一个应该不难,因为加密算法本身在hashlib中是可以支持的。

撰写回答