我一直在寻找一种在C#中使用预定密钥散列给定字符串的方法。
在我通过互联网尝试寻找一个例子的冒险中,我看到了许多MD5CryptoServiceProvider示例,这些示例似乎使用了机器的默认密钥,但没有一个应用特定密钥。我需要一个特定的密钥来编码数据,以便将其同步到其他人的服务器。我给它们一个散列字符串和一个ID号,然后用它们分析数据并向我返回一个类似的集合。所以无论如何都要通过一个与两者一致的特定键来使md5散列。
我希望在C#中完成这项工作,但是如果你不能使用这些库你可以使用某些网络语言,比如php或asp吗?
编辑:误解了我被抛入的场景,经过一段时间的坐着,想到为什么他们会让我使用一个键,看来他们想要一个附加在字符串末尾的键并进行哈希处理。这样,服务器可以附加它所具有的密钥以及传递的数据,以确保其是有效的访问计算机。无论如何......谢谢所有^ _ ^
Edit2:正如我在下面的评论中所说,这是“盐腌”这个词我没有注意到。噢,没有方向就被扔进新事物的乐趣。
答案 0 :(得分:18)
MD5不是加密 - 它是一个哈希。它不允许对字符串进行解密。
您正在寻找对称加密算法。它使用相同的密钥进行加密和解密。尝试使用加密函数without understanding them is dangerous。即使你认为你理解它们,你也会犯错误。
如果您要将数据传输到其他人的服务器,最好使用gpg之类的内容,使用您同意通过电话同意的对称密钥加密文件,或也许是一些公钥密码。这样,你就不会编写任何加密代码,而且它更安全(不完全安全,请注意,但更安全)。
编辑:我仍在尝试破译您的要求。
MD5是一个无键的哈希函数 - 根本没有使用密钥。因此,假设服务器向您发送一个巨大的字符串,或一个文件,以及它的哈希值。然后,您将MD5字符串或文件,并将您计算的哈希值与它们发送的哈希值进行比较。如果匹配 - 数据在传输中未损坏。 不意味着没有人篡改他们在途中发送给你的东西,因为MD5对它没有任何“暗示”。我可以md5任何我想要的东西并发送给你。
HMAC是键控哈希函数。它有一个秘密的成分,只有你和你正在通信的小组应该知道 - 秘密密钥。如果他们向您发送长字符串或文件以及HMAC,您可以自己计算HMAC,比较您的HMAC和他们的HMAC,如果匹配,数据在传输过程中没有损坏,数据也没有被篡改< /强>
答案 1 :(得分:2)
MD5是一个哈希函数,严格来说,它不用于“加密”字符串。它产生一个128位的“消息摘要”(因此名称中的MD),用作输入字符串的一种指纹。
答案 2 :(得分:0)
Tom是对的:MD5只是一个单向哈希,你不能解密它。试试这些链接:
答案 3 :(得分:0)
您可以使用C#中的AES来执行您要查找的加密类型。这是关于如何的an article。
答案 4 :(得分:0)
您应该使用从SymmetricAlgorithm
继承的其中一个类,例如:
答案 5 :(得分:0)
那么,如果两个输入字符串相同,为什么以下测试失败?
[TestMethod]
public void MD5HashTest()
{
var hash1 = (new MD5CryptoServiceProvider()).ComputeHash(new System.Text.ASCIIEncoding().GetBytes("now is the time for all good men."));
var hash2 = (new MD5CryptoServiceProvider()).ComputeHash(new System.Text.ASCIIEncoding().GetBytes("now is the time for all good men."));
Assert.AreEqual(hash1, hash2);
}