当四舍五入= 5000时,SHA512加密返回* 0

时间:2018-07-19 23:35:43

标签: python passwords glibc crypt

由于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...'

有人知道这种行为的原因吗?

1 个答案:

答案 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实现的一部分。