SHA512 crypt returns *0 当 rounds=5000
SHA512 crypt returns *0 when rounds=5000
自从 python 程序 returns *0
:
import crypt
# broken:
>>> crypt.crypt('pw', '$rounds=500023456789abcdef')
'*0'
# works:
>>> crypt.crypt("pw", '23456789abcdef')
'23456789abcdef$zAYvvEJcrKSqV2KUPTUM1K9eaGv20n9mUjWSDZW0QnwBRk0L...'
>>> crypt.crypt('pw', '$rounds=500123456789abcdef')
'$rounds=500123456789abcdef$mG98GkftS5iu1VOpowpXm1fgefTbWnRm4rbw...'
>>> crypt.crypt("pw", '$rounds=499923456789abcdef')
'$rounds=499923456789abcdef$ulXwrQtpwNd/t6NVUJo53AXMpp40IrpCHFyC...'
我用 crypt_r
对一个小的 C 程序做了同样的事情,输出是一样的。我在一些帖子中看到 *0
和 *1
会在有错误时被返回。
根据联机帮助页 crypt(3)
指定 rounds=xxx
参数自 glibc 2.7 起支持,默认值为 5000,当没有给出 rounds
参数时(如第二个示例) . 但为什么我不能将 rounds
设置为 5000?
我正在使用带有 glibc 2.27 的 Fedora 28。不同 Python 版本(甚至 Python2 和 Python3)的结果相同。在 PHP 中使用 crypt
也可以按预期工作。但最有趣的是 运行 在 Docker 容器 (fedora:28
) 中的相同命令有效:
>>> crypt.crypt("pw", '$rounds=500023456789abcdef')
'$rounds=500023456789abcdef$zAYvvEJcrKSqV2KUPTUM1K9eaGv20n9mUjWS...'
有人知道这种行为的原因吗?
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.” 评论:
This change makes us pickier about non-default round parameters to $ and $ hashes; numbers outside the valid range are now rejected, as are numbers with leading zeroes and an explicit request for the
default number of rounds. This is in keeping with the observation, in
the Passlib documentation, that allowing more than one valid crypt
output string for any given (rounds, salt, phrase) triple is asking
for trouble.
如果这导致太多兼容性问题,我建议打开一个问题。或者,您可以删除 rounds=5000
规范,但快速浏览一下,我认为该更改似乎应该恢复。它不是 glibc 中原始 libcrypt
实现的一部分。
自从 python 程序 returns *0
:
import crypt
# broken:
>>> crypt.crypt('pw', '$rounds=500023456789abcdef')
'*0'
# works:
>>> crypt.crypt("pw", '23456789abcdef')
'23456789abcdef$zAYvvEJcrKSqV2KUPTUM1K9eaGv20n9mUjWSDZW0QnwBRk0L...'
>>> crypt.crypt('pw', '$rounds=500123456789abcdef')
'$rounds=500123456789abcdef$mG98GkftS5iu1VOpowpXm1fgefTbWnRm4rbw...'
>>> crypt.crypt("pw", '$rounds=499923456789abcdef')
'$rounds=499923456789abcdef$ulXwrQtpwNd/t6NVUJo53AXMpp40IrpCHFyC...'
我用 crypt_r
对一个小的 C 程序做了同样的事情,输出是一样的。我在一些帖子中看到 *0
和 *1
会在有错误时被返回。
根据联机帮助页 crypt(3)
指定 rounds=xxx
参数自 glibc 2.7 起支持,默认值为 5000,当没有给出 rounds
参数时(如第二个示例) . 但为什么我不能将 rounds
设置为 5000?
我正在使用带有 glibc 2.27 的 Fedora 28。不同 Python 版本(甚至 Python2 和 Python3)的结果相同。在 PHP 中使用 crypt
也可以按预期工作。但最有趣的是 运行 在 Docker 容器 (fedora:28
) 中的相同命令有效:
>>> crypt.crypt("pw", '$rounds=500023456789abcdef')
'$rounds=500023456789abcdef$zAYvvEJcrKSqV2KUPTUM1K9eaGv20n9mUjWS...'
有人知道这种行为的原因吗?
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.” 评论:
This change makes us pickier about non-default round parameters to $ and $ hashes; numbers outside the valid range are now rejected, as are numbers with leading zeroes and an explicit request for the default number of rounds. This is in keeping with the observation, in the Passlib documentation, that allowing more than one valid crypt output string for any given (rounds, salt, phrase) triple is asking for trouble.
如果这导致太多兼容性问题,我建议打开一个问题。或者,您可以删除 rounds=5000
规范,但快速浏览一下,我认为该更改似乎应该恢复。它不是 glibc 中原始 libcrypt
实现的一部分。