我想使用{em> blowfish 加密通过crypt模块对密码进行哈希处理。
在Fedora 29上,我得到正确的结果:
$ python3.7
Python 3.7.2 (default, Jan 3 2019, 09:14:01)
[GCC 8.2.1 20181215 (Red Hat 8.2.1-6)] on linux
>>> import crypt
>>> crypt.crypt("password", "$2y$08$heregoesasaltstring...")
'$2y$08$heregoesasaltstring...ZR2mMC1niL.pkti1MfmoP.3XVbdoNHm'
>>>
在Ubuntu 18.04上,它什么也不返回:
$ python3.7
Python 3.7.2 (default, Dec 25 2018, 03:50:46)
[GCC 7.3.0] on linux
>>> import crypt
>>> crypt.crypt("password", "$2y$08$heregoesasaltstring...")
>>>
Fedora上的Python 3.7.1来自默认的存储库,而在Ubuntu上,来自官方存储库的python 3.7.1和我在external PPA上找到的python 3.7.1都可以看到问题。
是否存在任何可能改变Python行为的环境变量或基础程序/库?
答案 0 :(得分:0)
您的盐串在Ubuntu上无效。尝试删除所有这些美元符号。
从链接的crypt
模块的Python文档中:
该模块实现了 crypt(3)例程的接口
盐(随机的2或16个字符串,可能以
$digit$
为前缀来表示该方法),将用于干扰加密算法。 salt中的字符必须位于集合[./a-zA-Z0-9]
中,但模块化加密格式的前缀为$digit$
除外。
来自man 3 crypt
:
错误
EINVAL:盐格式错误。
我编写了一个测试程序来确认这一点:
#include <unistd.h>
#include <crypt.h>
#include <errno.h>
#include <stdio.h>
int main() {
char *s = crypt("password", "$2y$08$heregoesasaltstring...");
printf("%d\n%d\n%d\n", errno == EINVAL, errno == ENOSYS, errno == EPERM);
puts(s);
return 0;
}
在Ubuntu 18.04上的输出是
ibug@ubuntu:~/t $ gcc t.c -lcrypt
ibug@ubuntu:~/t $ a.out
1
0
0
Segmentation fault (core dumped)
139|ibug@ubuntu:~/t $
我手头没有Fedora,因此没有进行测试。您可以复制测试程序并自己编译和运行。