是否存在幂等散列函数?

时间:2015-04-25 19:03:36

标签: hash idempotent

是否存在幂等的哈希函数?我知道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上找到任何相关信息。

编辑:我并不是建议允许用户使用散列密码进行身份验证,这意味着服务器可以不对密码进行加密/散列。服务器仍然必须对原始密码或客户端哈希密码进行加密/哈希处理。

编辑:我并不是说允许用户使用客户端哈希密码登录是一种真正的安全性改进。据我所知,如果用户使用此密码的目的不止一个,那么增加的唯一可能的好处是。在这种情况下,如果攻击者发现了用户的哈希密码,那么只会访问我的服务,而不是所有服务共享该密码。但是,最佳做法是不要对多个服务使用相同的密码。

2 个答案:

答案 0 :(得分:1)

实际上,这种功能很容易找到,并且不会削弱系统的加密功能(除非是显而易见且琐碎的方式)。只要我们能够确定给定值是否是哈希函数的潜在输出,就可以将任何哈希函数实际上转换为幂等哈希函数(更正式的语言,如果域的元素也是的元素)范围)。

(执行此操作的一种可能方法是检查输入元素的大小,因为大多数哈希函数试图统一输出最大给定大小的值。这忽略了错误地标识永远不会从中输出的值的可能性哈希函数,但这将特定于单个哈希函数。)

然后,我们创建一个新方法,该方法检查哈希函数是否可以输出值,如果可以,则将值返回。否则,函数将正常进行并对该值进行哈希处理。此新函数与原始函数一样安全,只是其范围的哈希值完全不安全,但是在幂等哈希函数中不可避免。

答案 1 :(得分:0)

  

如果确实存在这样的算法,它是否有用加密?

好吧,考虑一下:哈希通常是两组之间的映射:

A -> B

其中B是可能的哈希值集合,A是可以清除的事物集合。

现在,通常A比B大得多 - 哈希就像更短的“校验和”,可以从更大的数据流中计算出来。 通常情况下,您仍然希望在哈希中尽可能少地发生冲突,这意味着从统计上来说,B中的所有元素应该具有相同数量的A映射到它们的元素,而A中的元素映射到相同的元素中。在一些指标下,B应该彼此“远离”。这意味着,B尽可能地努力成为恒定长度的整个单词集。找到一个能够做到这一点的系统函数将会非常困难,但仍然将每个元素从B映射到B中的相同元素;你“强制”碰撞。一般来说,这是一个加密的弱点,而且是一个严重的弱点。

现在,考虑一下您的密码案例:我不知道这有多大意义。在加密方面,让用户使用他/她的哈希密码进行身份验证是一个坏主意,因为无论你做什么,你都会提供有关如何伪造身份验证给所有窃听者的完整信息。