Language agnostic 密码散列在某些条件下是内射的吗?

Language agnostic 密码散列在某些条件下是内射的吗?,language-agnostic,hash,checksum,Language Agnostic,Hash,Checksum,很抱歉,这篇文章太长了,我对常见的crpytographic哈希算法有一个问题,比如SHA家族、MD5等 通常,这样的散列算法不能是内射的,因为产生的实际摘要通常具有固定长度(例如,SHA-1下的160位等),而要摘要的可能消息的空间实际上是无限的 但是,如果我们生成的消息摘要最多与生成的摘要一样长,那么常用的哈希算法的特性是什么?在这个有限的消息空间中,它们可能是内射的吗?是否存在已知的算法,即使在比特长度小于生成摘要的比特长度的消息上也会产生冲突 我实际上在寻找一种算法,它具有这个特性,也就

很抱歉,这篇文章太长了,我对常见的crpytographic哈希算法有一个问题,比如SHA家族、MD5等

通常,这样的散列算法不能是内射的,因为产生的实际摘要通常具有固定长度(例如,SHA-1下的160位等),而要摘要的可能消息的空间实际上是无限的

但是,如果我们生成的消息摘要最多与生成的摘要一样长,那么常用的哈希算法的特性是什么?在这个有限的消息空间中,它们可能是内射的吗?是否存在已知的算法,即使在比特长度小于生成摘要的比特长度的消息上也会产生冲突

我实际上在寻找一种算法,它具有这个特性,也就是说,至少在原则上,它可能会为短输入消息生成冲突哈希

背景:我们有一个浏览器插件,对于访问的每个网站,它都会发出服务器请求,询问该网站是否属于我们已知的合作伙伴之一。当然,我们不想监视我们的用户。因此,为了使生成某种冲浪历史变得困难,我们实际上并不发送访问过的URL,而是发送某个已清理版本的哈希摘要(目前为SHA-1)。在服务器端,我们有一个已知URI的哈希表,它与接收到的哈希相匹配。我们可以在这里存在一定的不确定性,因为我们认为不能跟踪用户的特征,而不是bug。 由于明显的原因,该方案非常模糊,并且允许误报以及不匹配的URI,而这些URI本应具有

所以现在,我们正在考虑将指纹生成更改为具有更多结构的内容,例如,我们可以改为:

  • 将主机名拆分为“.”处的组件,并分别散列这些组件
  • 将路径签入“.”处的组件,并分别对这些组件进行散列
  • 将结果哈希值加入指纹值。示例:使用此方案对“www.apple.com/de/shop”进行散列(并使用Adler 32作为散列)可能会产生“46989670.104268307.41353536/19857610/73204162”

    然而,由于这样的指纹有很多结构(特别是与普通的SHA-1摘要相比),我们可能会意外地使计算用户访问的实际URI变得非常容易(例如,通过使用“公共”组件值(如“www”)的预先计算的哈希值表)


    所以现在,我正在寻找一种哈希/摘要算法,它甚至在短消息上也有很高的冲突率(Adler 32被认真考虑),因此给定组件哈希唯一的概率很低。我们希望,我们强加的附加结构为我们提供足够的附加信息,以改善匹配行为(即,降低误报/漏报率)。

    我的印象是,您实际上想要,您为访问者提供一个用于编码URL的公钥,然后使用密钥对URL进行解密


    有一点。

    我不相信哈希对于与摘要大小相同的消息一定是内射的。如果是,它们将是双射的,这将缺少散列的要点。这表明它们对于小于摘要的消息也不是内射的

    如果您想鼓励冲突,我建议您使用任何您喜欢的哈希函数,然后丢弃位,直到它发生足够的冲突

    例如,丢弃SHA-1散列中的159位将获得相当高的冲突率。你可能不想扔掉那么多

    然而,你试图实现的目标似乎天生可疑。您希望能够知道URL是您的URL之一,而不是它是哪一个。这意味着您希望您的URL彼此冲突,但不要与非您的URL冲突。哈希函数不会为您这样做。相反,因为冲突是随机的,因为有更多的URL不是你的,而不是你的(我假设!),任何给定级别的冲突都会导致关于某个URL是否是你的,而不是它是你的


    相反,如何在启动时将URL列表发送到插件,然后让它只发送回一个位,指示它是否正在访问列表中的URL?如果不想显式发送URL,请发送哈希(不要尝试最大化冲突)。如果您想节省空间,请发送一个。

    因为您愿意接受误报率(也就是说,被确定为白名单的随机站点,而事实上它们不是),a可能就是最好的选择

    每个客户端下载一个包含整个白名单的Bloom过滤器。这样,客户机就不需要与服务器进行其他通信,也就不存在间谍活动的风险

    如果每个URL有2个字节,则误报率将低于0.1%,如果每个URL有4个字节,则误报率将低于400万分之一

    下载整个过滤器(或者定期更新)是一项巨大的前期带宽投资。但是假设它上面有一百万个URL(这对我来说似乎太多了,因为你可以在查找之前应用一些规则来规范化URL),它的下载量是4MB。将此与一百万个32位哈希列表进行比较:大小相同,但误报率约为1/4000,因此Bloom过滤器在紧凑性方面获胜

    我不知道这个插件是如何与服务器联系的,但我怀疑你是否能在1kB以下完成HTTP事务——可能在保持活动连接的情况下更少。如果给定用户的过滤器更新频率低于每4k URL访问一次(或者如果URL少于一百万次,则更新次数较少;如果URL的误报概率大于400万分之一,则更新次数较少),则有可能使用较少的bandwidt