【问题标题】:SQL Server hash algorithmsSQL Server 哈希算法
【发布时间】:2015-01-09 21:47:37
【问题描述】:

如果我的输入长度小于哈希输出长度,是否有任何哈希算法可以保证没有冲突。

我从本质上知道,由于散列的有损性质,单向散列可能会在多个输入之间发生冲突,尤其是考虑到输入大小通常大于输出大小时,但这仍然适用于较小的输入大小吗?

【问题讨论】:

  • 我会看看这些帖子link 1link 2
  • @Xedni,您的链接似乎指向同一个帖子
  • @Dave.Gugg 每只眼睛一个?
  • 一定是复制粘贴失败。无论如何,看起来给出了一个合适的答案:)

标签: sql-server sql-server-2008 hash


【解决方案1】:

使用带有随机选择的静态密钥的对称分组密码。加密永远不会产生重复,因为这会阻止明确的解密。

此方案将强制输出一定长度,该长度是密码块大小的倍数。如果您可以使用可变长度输出,您也可以使用流密码。

【讨论】:

    【解决方案2】:

    您的问题听起来像是在寻找完美的哈希函数。完美哈希函数的问题在于它们往往针对特定的数据集进行定制。

    以下假设您没有尝试隐藏、保护或加密数据...

    换个角度想,“生成”一个可以接受输入的完美哈希函数的最简单方法是将要存储的数据映射到表中,并将这些输入与代理主键相关联。然后,您为列(或多列)创建唯一约束,以确保您要映射的输入仅映射到单个代理值。

    代理键可以是 int、bigint 或 guid。这完全取决于您要存储多少行。

    【讨论】:

      【解决方案3】:

      如果已知您的输入长度很小,例如 32 位,那么您实际上可以枚举所有可能的输入并检查生成的哈希是否存在冲突。这只会是 4294967296 个可能的输入,并且不应该花费很长时间来枚举所有这些。本质上,您将构建一个彩虹表来测试碰撞。

      如果有一些依赖于此的安全性,其中一个问题是如果攻击者知道您的输入长度受到限制,那么他们很容易也可以执行相同的枚举来创建一个映射哈希的映射/表回到原来的值。 “攻击者”在这里是一个非常糟糕的术语,因为我不知道您如何使用这些哈希以及您是否担心能够逆转它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-03
        • 2018-01-17
        • 2021-05-03
        相关资源
        最近更新 更多