所以,我有一个文本文件存储在二进制(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();
}
检查这两个值是否合法,以确保值相同?
答案 0 :(得分:1)
您是如何从数据库中检索数据的?我的猜测是你的数据库正在编码数据(可能是ASCII或UTF8),因此当你检索数据并将其推送到你的byte []时,它看起来“搞砸了”。你需要再次解码它。
检查这个的最简单方法是将值推入字符串并打印字符串。如果它看起来正确那么,这是你的答案。
在您更新后 - 该解决方案肯定会有效。
然而,保持GetHash函数返回的byte []会更好。然后,您需要弄清楚数据库驱动程序如何对数据进行编码并将其反转以获取byte []。
这取决于此代码的可维护性。
答案 1 :(得分:0)
检查哪两个值?
简短回答 - 可能不是。
您的问题没有解释如何在数据库中插入哈希。我甚至无法做出好的猜测,因为你说“出于演示目的,这个散列是12345678”,如果你的散列是一个字节数组,那么这是不可能的。单个字节的最大值是255,如果你要组合字节,我不知道你在做什么顺序。此外,我不知道你实际存储在数据库中的是什么。你在存储一个字符串,你还有一些其他功能来存储一个字节数组吗?
这是你应该做的。
现在,由于所有哈希字符串都是由同一个函数生成的,因此可以确定如果两个哈希字符串不匹配,则出于以下原因之一:
假设良好的做法,在你不知道的情况下,2和3应该是不太可能发生的。