我想使用河豚加密使用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 37.1都可以看到问题。

是否有任何环境变量或基础程序/库可能会改变Python的行为?

最佳答案

您的盐字符串在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,所以没有进行测试。您可以复制测试程序并自己编译和运行它。

关于python - ubuntu与fedora上crypt.crypt的不同结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54294135/

10-11 09:21