SHA-512身份验证没有意义
沉默的广场在新品葱写过这样一篇:
【安全上网】用SHA-512生成身份字符串,在匿名环境下证明自己的身份
概述:
- 计算SHA512("something only you know")得到"D75A31E4F109C...",由于SHA512是不可逆的运算(类似MD5),所以即便"D75A31..."被公布出去,别人也猜不到"something only you know"。
- 把 "D75A31..." 贴到某个公开的地方,例如自己的账户备注中
- 现在你要向第三方证明 "D75A31..." 确实是你贴出的(你就是账户的主人),于是你出示 "something only you know" 给别人,别人运行一次SHA512("something..."),得到"D75A31...",证明原来贴出"D75A31..."的人是你。
存在的问题:
- 如果你公开贴出这行字("something..."),别人就可以截取复制这行字(直接看到或监听),再以别人的身份发出来。这样便可能导致多个人声称自己是你,无法确定哪个是真的。
- 如果你向某人私下出示这行字,而这个人将这行字发给其他人,其他人就可以声称自己是你
总结:SHA-512身份验证并不实用,没有意义。
真正安全可靠验证身份的方法,是公钥密码学。本站现已支持PGP签名登录,详情见#7506。
沉默的广场 补充一下,公钥验证也有类似的风险。举个例子,我在某处用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名),其它人再用公钥去验证这段消息。只要私钥不泄露,没有私钥的人就没法给指定文字签名。
总之,设计完善的加密系统,比如公钥认证,都有考虑到这些问题,不用担心它们的安全性。
夢野新作變革派諷喻小說家、詩人,原名 煤山歪樹 所以散列只能在公共場合進行一次認證。但如果管理員在貼出來之前先審核一下的話…