是否存在幂等的哈希函数?我知道 MD5 和 SHA256 不是:
$ echo -n "hello world" | md5sum
5eb63bbbe01eeed093cb22bb8f5acdc3 -
$ echo -n "5eb63bbbe01eeed093cb22bb8f5acdc3" | md5sum
c0b0ef2d0f76f0133b83a9b82c1c7326 -
$ echo -n "hello world" | sha256sum
b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 -
$ echo -n "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9" | sha256sum
049da052634feb56ce6ec0bc648c672011edff1cb272b53113bbc90a8f00249c -
有没有可以做这样的事情的哈希算法?
$ echo -n "hello world" | idempotentsum
abcdef1234567890
$ echo -n "abcdef1234567890" | idempotentsum
abcdef1234567890
如果确实存在这样的算法,它在密码学上是否有用?即有合理的输入,用已知输出猜测输入在计算上是不可行的吗?
如果这样的算法不存在,它不存在是因为没有人费心去寻找它,还是在数学上不可能?
语境
我正在开发一个用户可能希望在密码管理器中保存密码的系统。特别偏执的用户可能更喜欢以散列形式而不是纯文本形式保存密码。我希望用户能够使用此散列密码进行身份验证。而不是简单地尝试两次身份验证(一次假设用户的密码被散列,一次假设它不是),我想知道是否有一种算法让我只做一次。
我知道有允许用户存储身份验证令牌而不是纯文本密码的替代方法。但是这个想法突然出现在我的脑海中,我很好奇。我在 Google 或 SO 上找不到任何关于此的内容。
编辑:我并不是建议允许用户使用散列密码进行身份验证意味着服务器不加盐/散列密码是可以的。服务器仍必须对原始密码或客户端哈希密码进行加盐/哈希处理。
编辑:我并不是说允许用户使用客户端哈希密码登录是真正的安全改进。据我所知,这将增加的唯一可能的好处是,如果用户将此密码用于多个目的。在这种情况下,如果攻击者发现了用户的哈希密码,那么只有对我的服务的访问会受到威胁,而不是所有共享该密码的服务。但是,最佳做法是不要对多个服务使用相同的密码。