如何解决crypt() 使用带 `+`
为什么从 CentOS 8 开始,crypt 在盐中的 +
有问题??
CentOS 7:
首先在 CentOS 7 机器上创建盐:
[root@localhost map]# /usr/bin/head -c18 /dev/urandom | /usr/bin/openssl base64
M9aZENv5Gm71Y+cwUyaUOcSp
注意盐中的 +
...
更新盐计算:cat /dev/urandom | tr -dc 'a-zA-Z0-9./' | head -c16
-> crypt() 字符集
[root@localhost map]# perl -e 'print crypt("testpwd","\$6\$M9aZENv5Gm71Y+cwUyaUOcSp\$") . "\n `
$6$M9aZENv5Gm71Y+cw$LBRLY1IpcFLA.gNBe0V4nkbP8qg40fhgFv1rIW/U4wTvthNX/nvhEKsXziCxMKSoSOzlv3ukfeIcrXTP26363/
CentOS 8:
[root@localhost map]# perl -e 'print crypt("testpwd","\$6\$M9aZENv5Gm71Y+cwUyaUOcSp\$") . "\n"'
[root@localhost map]#
因此,它在 CentOS 8 上返回 NULL
。我的猜测是 +
在使用 crypt()
的盐中不再有效
如果您从盐中去除 +
,它会起作用。这里发生了什么,还有其他不好的盐字符吗??
更新
我在 https://serverfault.com/questions/88284/how-is-a-password-hash-encoded-in-the-shadow-password-file 处找到了这篇文章:
如果您只想知道密码是如何编码的,crypt() 使用一种特殊的 Base64 类型的编码。由于我使用的是 Base64 而不是 crypt() 字符集,“+”把事情搞砸了,因为它在 crypt 字符集中无效。仍然不知道为什么它在 CentOS 7 和 8 中被允许..
Base64 编码使用以下字符集:ABCDEFGHIJKLMnopQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
虽然 crypt() 编码使用这个字符集:./0123456789ABCDEFGHIJKLMnopQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
因此,我现在将使用它为密码创建适当的盐,使用 tr
来包含来自 crypt()
字符集的字符。
cat /dev/urandom | tr -dc 'a-zA-Z0-9./' | head -c16
ayHTWqcZIT1h.LLg
谢谢扎克!!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。