咨询大佬个密码验证的问题

2021-11-25 13:43:35 +08:00
 d0m2o08

Ansible 的 user 模块中,对如何生成用户密码给了集中方法,其中一种是这样实现的

/etc/ansible ⌚ 13:36:09
$ python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
Password:
$6$ugLvJs2HQIVNoXW0$F8sbBsLT/dcU/HVFVlHqNNSpxZwwpt2R4tP7cE/JvYKjQnPX137YzNaPGo6t/EwX3Ick17Gm7E7N2qD.N.A3h/

/etc/ansible ⌚ 13:36:13
$ python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
Password:
$6$EZ5ZGsr7dlFrHzS0$5vNcNAtkUw41P8NCuHpp.Um5DHoNoH8mSbmTjc0fTgH95Gq4zDFpcsnLvd4T26Zx0gSLRdBxlzkNdMHC.kLub.

/etc/ansible ⌚ 13:36:17
$ python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
Password:
$6$zem4hGz27MgX4k8X$Mn6n08MCPtvCzbJTmjYVnBX/JpU7dEUKK.o0F60UA5rsbBLLLXZZb2bWRrBazpCHY.ugEPw0bgiwwvsvgfyTK/

/etc/ansible ⌚ 13:38:25
$

我每次输入的密码都是 1234 ,但是生成的值是不同的,那如何验证这些不同的值是同一个密码呢

1687 次点击
所在节点    程序员
8 条回复
2i2Re2PLMaDnghL
2021-11-25 14:20:10 +08:00
这个密码存储从设计上避免了你说的这个漏洞。
yanqiyu
2021-11-25 15:43:04 +08:00
生成的值不一样是有随机加盐,不然别人拿到 hash 就可能能查表还原密码了

这类 hash 的规范就是
$<ID>$<SALT>$<PWD>
比如 $6$zem4hGz27MgX4k8X$Mn6n08MCPtvCzbJTmjYVnBX/JpU7dEUKK.o0F60UA5rsbBLLLXZZb2bWRrBazpCHY.ugEPw0bgiwwvsvgfyTK/

对应的就是
id=6 对应 SHA-512
盐是 zem4hGz27MgX4k8X
HASH=Mn6n08MCPtvCzbJTmjYVnBX/JpU7dEUKK.o0F60UA5rsbBLLLXZZb2bWRrBazpCHY.ugEPw0bgiwwvsvgfyTK/

盐每次都不一样于是后面的 hash 就不一样了

怎么解析就是拿到密码,拿到盐,按照算法算 hash (怎么算要查规范,主要是密码和盐的拼接以及 hash 迭代次数等等),看输出的 hash 是不是等于最后一段
(我猜肯定有现成的轮子)
3dwelcome
2021-11-25 15:51:26 +08:00
楼主的问题,就和 RSA 数据加密后,为什么每次加密的结果都是不一样的,是同一个道理。

说白了,这类算法,就是要“不一样”这个效果。

至于内部实现,就是楼上说的加盐或者随机 padding 。
eason1874
2021-11-25 15:52:07 +08:00
“如何验证这些不同的值是同一个密码呢”

这类密码哈希,要验证密码,不是再 hash 一次去对比,而是用配套的验证函数。要验证密码是否正确,你看文档找到对应的函数方法去调用就可以了

如果你是想做彩虹表,那别想了,随机哈希就是为了让彩虹表失效
bruce0hh
2021-11-25 16:57:18 +08:00
这种密码设计,盐是不是也要存储啊
gadfly3173
2021-11-25 17:08:36 +08:00
比如 jhash 的 pbkdf2 的实现就是

pbkdf2sha256:64000:18:24:n:yUnDokcNRbwILZllmUOItIyo9MnI00QW:6ZcPf+sfzyoygOU8h/GSoirF
算法:重复次数:hash 大小:盐大小:pepper:盐:hash

验证的时候就根据:拆分,然后重新计算一遍,比较是否符合
yin1999
2021-11-25 17:17:48 +08:00
@bruce0hh 需要存储,一般会存一起,然后和其它的 hash 之类的,用点隔开
hxndg
2021-11-25 18:36:44 +08:00
目的就是为了 让你不能 “验证这些不同的值是同一个密码”

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/817894

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX