首页 > 解决方案 > 当 rounds=5000 时,SHA512 crypt 返回 *0

问题描述

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

我用一个小的 C 程序做了同样的事情,crypt_r输出是一样的。我在一些帖子中读到,*0并且*1会在出现错误时返回。

根据手册页,自 glibc 2.7 起支持crypt(3)rounds=xxx参数,默认值为 5000,当没有rounds给出参数时(如第二个示例中所示)。但是为什么我不允许设置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...'

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

标签: pythonpasswordsglibccrypt

解决方案



推荐阅读