【问题标题】:Is it possible to have SHA-512 collisions using this hash creation strategy?使用这种哈希创建策略是否有可能发生 SHA-512 冲突?
【发布时间】:2012-05-30 22:05:46
【问题描述】:

假设我正在使用此代码生成哈希:

static void Main(string[] args) {

    string id = Guid.Parse("8681941A-76C2-4120-BC34-F800B5AAB5A5".ToLower()).ToString();
    string date = DateTime.Today.ToString("yyyy-MM-dd");

    Console.WriteLine(id);
    Console.WriteLine(date);

    using (System.Security.Cryptography.SHA512Managed hashTool = 
        new System.Security.Cryptography.SHA512Managed()) {

        Byte[] PasswordAsByte = System.Text.Encoding.UTF8.GetBytes(string.Concat(id, date));
        Byte[] EncryptedBytes = hashTool.ComputeHash(PasswordAsByte);
        hashTool.Clear();

        Console.WriteLine(Convert.ToBase64String(EncryptedBytes));

    }
    Console.ReadLine();
}

在一个真实世界的示例中,我将生成带有 GUID 和日期的哈希值,正如您在示例中看到的那样。我将从数据库中获取这些值。

是否有可能使用这种方法获得具有不同值的相同哈希结果?

编辑:

正如我所指出的,我将从数据库中提取值。你可以猜到,Guid 是唯一的 id 键(如果我没有遇到奇迹并且 sql server 多次为我生成相同的 Guid)。 datetime 值将作为记录的付款到期日。我在这里使用DateTime.Today 进行了演示,但我绝对不会在产品上使用它。

【问题讨论】:

  • 每个哈希算法迟早都会产生冲突,但在大多数情况下,“稍后”太长了,所以你永远不要关心它。
  • @zerkms 谢谢!假设这是一个电子商务应用程序,我应该继续不关心吗?
  • 投票重新开放。 这个问题有几个特点,使它很有趣,并且不同于其他“哈希函数可以碰撞吗?”问题,因为我们在这里也讨论了散列的 输入
  • @L.B 我不明白你在说什么。它产生与预期相同的结果。
  • @JohnFeminella - 所以你认为作为Are GUID collisions possible? 的变体更有趣?

标签: c# hash sha sha512


【解决方案1】:

对于在同一天被多次拉取的给定 GUID,您肯定会遇到哈希冲突。例如,如果您为特定 GUID g 生成哈希,则拉取g 在 2012 年 2 月 20 日 12:00 产生的哈希值与您在 18:00 拉取它的哈希值相同,因为您只考虑日期,而不是时间。

对于不相关的 GUID,仍有可能发生哈希冲突。可能的哈希空间为 64 位,小于无穷大,这意味着由于 pigeonhole principle 的存在,必然会有重复。但是,可能性极小——事实上,您应该将其视为零。

【讨论】:

  • 谢谢!正如我所指出的,我将从数据库中提取值。你可以猜到,Guid 是唯一的 id 键(如果我没有遇到奇迹并且 sql server 多次为我生成相同的 Guid)。 datetime 值将作为记录的付款到期日。我在这里使用DateTime.Today 进行了演示,但我绝对不会在产品上使用它。
【解决方案2】:

就像在任何哈希函数中一样,它可能会非常非常罕见地发生。

一个好的散列函数会从两个相邻输入中产生不同的结果。 SHA512 被认为是一种很好的哈希算法,因此在您的情况下应该不是问题。

【讨论】:

    【解决方案3】:

    我不明白所有这些讨论? 即使您的数据库中有 1000 万个条目,发生冲突的可能性也像

    0.000000000003%(查了sha256,所以sha512的机会更小了)

    即使你有 1 亿个条目,也不用担心,如果你真的想确定,可以在文本之间添加一些内容,然后对其进行哈希处理。

    $newtext= wordwrap("mytexttexttext", 8, "myspliter", true);
    

    【讨论】:

    • 问题中何时引用了PHP?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多