【问题标题】:MD5 byte arrays not the sameMD5字节数组不一样
【发布时间】:2014-01-29 18:05:32
【问题描述】:

所以,我有一个文本文件存储在二进制(16)字段中,该字段已使用以下代码转换为 MD5 哈希:

public static byte[] GetHash(string inputString)
{
    HashAlgorithm algorithm = MD5.Create(); // SHA1.Create()
    return algorithm.ComputeHash(Encoding.UTF8.GetBytes(inputString));
}

好的,因此出于演示目的,此哈希为 12345678 - 我将其插入数据库,然后处理完全相同的文件。同样,创建相同的 12345678 字节数组,通过从数据库中选择哈希字段来确认:

SELECT HashValue from table

这会返回 12345678 两次,这很好。

但是,当我将此哈希值存储在 c# 中的 byte[] 中时,情况就完全不同了

任何原因,因为我在 c# 中的 sql 语句返回 12345678(在 SQL 跟踪中查看)

更新

好的,在@jakebower 之后,我创建了这个方法,并传递了由 c# 生成的当前哈希和从 SQL 中检索到的哈希,并且两个字符串都是相同的。

public static string GetHashString(string inputString)
{
    var sb = new StringBuilder();
    foreach (var b in GetHash(inputString))
        sb.Append(b.ToString("X2"));

    return sb.ToString();
}

检查这两个值是否是确保值相同的合法测试?

【问题讨论】:

    标签: c# md5


    【解决方案1】:

    您如何从数据库中检索数据?我的猜测是您的数据库正在对数据进行编码(可能是 ASCII 或 UTF8),因此当您检索数据并将其塞入 byte[] 时,它看起来“一团糟”。你需要重新解码。

    检查这一点的最简单方法是将值推入字符串并打印字符串。如果它看起来正确,那么这就是你的答案。

    根据您的更新 - 该解决方案肯定会奏效。

    不过,最好保留 GetHash 函数返回的 byte[]。然后你会想弄清楚你的数据库驱动程序是如何对数据进行编码并反转它以获取 byte[] 回来的。

    这取决于这段代码的可维护性。

    【讨论】:

      【解决方案2】:

      检查哪两个值?

      简短的回答 - 可能不是。

      您的问题没有解释哈希是如何插入数据库的。我什至无法很好地猜测,因为您说“出于演示目的,此哈希是 12345678”,如果您的哈希是字节数组,那么这是不可能的。单个字节的最大值是 255,如果你正在组合字节,我不知道你是按什么顺序做的。此外,我不知道您实际上在数据库中存储了什么。你是在存储一个字符串,你有没有其他的函数来存储一个字节数组?

      这是你应该做的。

      1. 使用 GetHashString() 函数生成存储在数据库中的字符串。
      2. 使用您的 GetHashString() 函数生成您针对数据库中的字符串进行测试的字符串。

      现在,由于所有哈希字符串都是由同一个函数生成的,因此您可以确定如果任何两个不匹配,那是由于以下原因之一:

      1. 源数据已更改。
      2. 有人更改了数据库中的哈希字符串
      3. 有人更改了您的 GetHashString() 函数。

      假设良好的做法,2 和 3 应该极不可能在你不知情的情况下发生。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-18
        • 1970-01-01
        • 2018-05-16
        • 2011-01-27
        • 1970-01-01
        • 2015-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多