由于python程序在几天后返回*0
:
import crypt
# broken:
>>> crypt.crypt('pw', '$6$rounds=5000$0123456789abcdef')
'*0'
# works:
>>> crypt.crypt("pw", '$6$0123456789abcdef')
'$6$0123456789abcdef$zAYvvEJcrKSqV2KUPTUM1K9eaGv20n9mUjWSDZW0QnwBRk0L...'
>>> crypt.crypt('pw', '$6$rounds=5001$0123456789abcdef')
'$6$rounds=5001$0123456789abcdef$mG98GkftS5iu1VOpowpXm1fgefTbWnRm4rbw...'
>>> crypt.crypt("pw", '$6$rounds=4999$0123456789abcdef')
'$6$rounds=4999$0123456789abcdef$ulXwrQtpwNd/t6NVUJo53AXMpp40IrpCHFyC...'
我使用crypt_r
在一个小型C程序中执行了相同的操作,并且输出相同。我在一些帖子中读到,发生错误时将返回*0
和*1
。
根据手册页crypt(3)
,指定了rounds=xxx
参数,因为glibc 2.7,并且在没有给出rounds
参数的情况下默认值为5000(如第二个示例)。 但是为什么我不能将rounds
设置为5000?
我正在将Fedora 28与glibc 2.27一起使用。不同的Python版本(甚至Python2和Python3)的结果相同。在PHP中使用crypt
也可以正常工作。但是最有趣的是,在Docker容器(fedora:28
)中运行相同的命令是可行的:
>>> crypt.crypt("pw", '$6$rounds=5000$0123456789abcdef')
'$6$rounds=5000$0123456789abcdef$zAYvvEJcrKSqV2KUPTUM1K9eaGv20n9mUjWS...'
有人知道这种行为的原因吗?
答案 0 :(得分:3)
libxcrypt sources包含以下内容:
/* Do not allow an explicit setting of zero rounds, nor of the default number of rounds, nor leading zeroes on the rounds. */
这是introduced in a commit “Add more tests based on gaps in line coverage.”,有此评论:
此更改使我们对$ 5 $和$ 6 $散列的非默认舍入参数更加挑剔;有效范围之外的数字现在将被拒绝,带前导零的数字以及显式请求 默认轮数。这与观察结果一致 Passlib文档,该文档允许多个有效的密码 任何给定(三舍五入,盐,短语)的输出字符串都要求 麻烦。
如果这会引起太多兼容性问题,我建议打开一个问题。另外,您可以删除rounds=5000
规范,但是快速浏览一下,对我来说好像是应该还原所做的更改。它不是glibc中原始libcrypt
实现的一部分。