微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

crypt() 使用带 `+`

如何解决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 举报,一经查实,本站将立刻删除。