是否可以使用此哈希创建策略进行SHA-512冲突?

时间:2012-02-20 20:53:02

标签: c# hash sha sha512

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

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和Date的散列,如您在示例中看到的那样。我将从数据库中获取这些值。

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

修改

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

3 个答案:

答案 0 :(得分:1)

对于在同一天多次提取的给定GUID,您肯定会遇到哈希冲突。例如,如果您为特定GUID g生成哈希,然后在2012-02-20 12:00的时候拉g产生相同的哈希,就像你在18:00拉它一样,因为你只考虑了日期而不是时间。

对于不相关的GUID,仍然可能发生哈希冲突。可能的哈希空间是64位,小于无穷大,这意味着必须通过 pigeonhole principle 重复。但是,非常不可能 - 事实上,你不应该把它当作零。

答案 1 :(得分:0)

与任何哈希函数一样,它可能非常非常罕见。

良好的散列函数会从两个邻居输入产生不同的结果。 SHA512被认为是一种很好的哈希算法,所以在你的情况下它应该不是问题。

答案 2 :(得分:0)

我不明白所有这些讨论? 即使你的数据库中有1000万个条目,碰撞的可能性就像

0.000000000003%(看了sha256,所以sha512的几率更低)

即使您有1亿条记录,也不要担心,如果您确实想要确定,请在文本之间插入一些内容然后将其哈希。

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