文章

SHA-512身份验证没有意义

thphd  ·  2020年9月24日 2047前站长

沉默的广场在新品葱写过这样一篇:

【安全上网】用SHA-512生成身份字符串,在匿名环境下证明自己的身份

概述:

  1. 计算SHA512("something only you know")得到"D75A31E4F109C...",由于SHA512是不可逆的运算(类似MD5),所以即便"D75A31..."被公布出去,别人也猜不到"something only you know"。
  2. 把 "D75A31..." 贴到某个公开的地方,例如自己的账户备注中
  3. 现在你要向第三方证明 "D75A31..." 确实是你贴出的(你就是账户的主人),于是你出示 "something only you know" 给别人,别人运行一次SHA512("something..."),得到"D75A31...",证明原来贴出"D75A31..."的人是你。

存在的问题:

  • 如果你公开贴出这行字("something..."),别人就可以截取复制这行字(直接看到或监听),再以别人的身份发出来。这样便可能导致多个人声称自己是你,无法确定哪个是真的。
  • 如果你向某人私下出示这行字,而这个人将这行字发给其他人,其他人就可以声称自己是你

总结:SHA-512身份验证并不实用,没有意义。

真正安全可靠验证身份的方法,是公钥密码学。本站现已支持PGP签名登录,详情见/t/7506

菜单
  1. thphd   2047前站长

    有人提问:可是PGP签名之后的信息,如果公开贴出,也可能被人拿去冒充自己。

    这个问题其实很好解决。假如你是账户 @蒹葭苍苍 的所有者,你现在的用户名是 @蒹葭苍苍2,但是有人故意要冒充你(@蒹葭苍苍3),你可以用你的私钥,签名你当前的用户名(例如“蒹葭苍苍2”),而冒充者(“蒹葭苍苍3”)是做不到这一点的(因为他没有你的私钥)。

  2. 沉默的广场  

    补充一下,公钥验证也有类似的风险。举个例子,我在某处用GPG签名消息:

    -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA256
    
    我是沉默的广场
    -----BEGIN PGP SIGNATURE-----
    
    iHUEARYIAB0WIQTF8OptO5XfOiJV/ShY4kD6KqTWnwUCX2xi4AAKCRBY4kD6KqTW
    n+lLAP9u0pwiha8PAwUg(。。省略)
    -----END PGP SIGNATURE-----
    

    别人截取这段消息,就可以保存起来,日后贴出来冒用账户主人的身份。其它人没法判断这个消息是由本人贴出来的,还是别人复制过去冒用的。

    这是重放攻击的一个简单例子。解决办法是,和签名日期章一样,消息里加上当前时间就可以防止冒用,例如:

    -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA256
    
    我是沉默的广场
    
    1989年6月4日,05:00
    -----BEGIN PGP SIGNATURE-----
    
    iHUEARYIAB0WIQTF8OptO5XfOiJV/ShY4kD6KqTWnwUCX2xjKQAKCRBY4kD6KqTW
    n7KpAQCDdAO80d/K/K(。。省略)
    -----END PGP SIGNATURE-----
    

    这样其它人可以比对签名里的时间和当前时间,验证是不是有人冒用了消息。

    另一种防止冒充身份的方法是challenge-response认证,和@thphd 所说的一样。原理是让账户的主人用私钥签名一段指定文字(比如自己的新ID名),其它人再用公钥去验证这段消息。只要私钥不泄露,没有私钥的人就没法给指定文字签名。

    总之,设计完善的加密系统,比如公钥认证,都有考虑到这些问题,不用担心它们的安全性。

  3. 夢野新作   變革派諷喻小說家、詩人,原名 煤山歪樹

    所以散列只能在公共場合進行一次認證。但如果管理員在貼出來之前先審核一下的話…