V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
d0m2o08
V2EX  ›  程序员

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

  •  
  •   d0m2o08 · 2021-11-25 13:43:35 +08:00 · 1791 次点击
    这是一个创建于 1095 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 ,但是生成的值是不同的,那如何验证这些不同的值是同一个密码呢

    第 1 条附言  ·  2021-11-25 21:18:13 +08:00
    感谢各位大佬,2L 讲的我明白了,再次感谢
    8 条回复    2021-11-25 18:36:44 +08:00
    2i2Re2PLMaDnghL
        1
    2i2Re2PLMaDnghL  
       2021-11-25 14:20:10 +08:00   ❤️ 1
    这个密码存储从设计上避免了你说的这个漏洞。
    yanqiyu
        2
    yanqiyu  
       2021-11-25 15:43:04 +08:00   ❤️ 1
    生成的值不一样是有随机加盐,不然别人拿到 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
        3
    3dwelcome  
       2021-11-25 15:51:26 +08:00   ❤️ 1
    楼主的问题,就和 RSA 数据加密后,为什么每次加密的结果都是不一样的,是同一个道理。

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

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

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

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

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

    验证的时候就根据:拆分,然后重新计算一遍,比较是否符合
    yin1999
        7
    yin1999  
       2021-11-25 17:17:48 +08:00 via Android
    @bruce0hh 需要存储,一般会存一起,然后和其它的 hash 之类的,用点隔开
    hxndg
        8
    hxndg  
       2021-11-25 18:36:44 +08:00
    目的就是为了 让你不能 “验证这些不同的值是同一个密码”
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   932 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:40 · PVG 06:40 · LAX 14:40 · JFK 17:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.