ubuntu与fedora上crypt.crypt的不同结果

时间:2019-01-21 16:31:36

标签: python ubuntu fedora

我想使用{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行为的环境变量或基础程序/库?

1 个答案:

答案 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,因此没有进行测试。您可以复制测试程序并自己编译和运行。