在C#中给定一个密钥进行MD5哈希处理

5
我一直在寻找一种使用预定密钥的C#字符串哈希方法。在我通过互联网寻找示例时,我看到了许多MD5CryptoServiceProvider示例,这些示例似乎使用默认机器密钥,但没有一个应用特定密钥的示例。我需要有一个特定的密钥来编码数据,以便将其与他人的服务器同步。我将给他们一个散列字符串和一个ID号码,他们使用它来分析数据并向我返回类似的数据集。那么有没有办法使md5通过特定的密钥进行哈希,这对双方都是一致的呢?
我希望这可以在C#中完成,但如果库无法实现,您能否使用一些Web语言(如php或asp)来实现?
编辑:我误解了我被扔进的情况,并经过一点思考为什么他们要让我使用密钥,看起来他们想在字符串末尾附加一个密钥并进行哈希。这样,服务器就可以将其具有的密钥与传递的数据一起附加以确保它是有效的访问计算机。无论如何...谢谢大家^_^
编辑2:正如我下面的评论所说,我对“盐”的概念一无所知。哦,被扔进一个没有方向的新东西的乐趣。

1
没有MD5的密钥...正如Tom Ritter指出的那样,它不是一种加密算法。 - Thomas Levesque
正如大家指出的那样,MD5是哈希而不是加密,但从您的帖子中并不清楚您是否实际上需要哈希并且说错了,还是真的需要加密。请澄清一下。 - annakata
你的编辑并没有真正澄清你的问题。MD5不使用你所询问的“预定密钥”。然而,如果你只需要比较哈希值,那么只需对你的两个输入进行哈希处理,并逐位比较结果即可。请注意,即使输入只有微小的变化,MD5通常(除了哈希冲突的极少情况)也会给出完全不同的结果。 - Naaff
我认为他的意思是他想要给字符串加盐以进行哈希。这样服务器就可以使用相同的盐来验证输入。 - beach
1
是的,我查了一下加盐,这正是我需要的。工作让我做完全不了解的事情,真是太糟糕了。至少我学到了新东西,对吧。 - Jared
附注:在哈希之前将另一个字符串的末尾添加一个额外的预定字符串称为“加盐”。预定字符串称为“盐”。例如,如果我想使用加盐技术哈希“incrediman”,我会附加一个预定的盐,如“1234”,然后哈希整个字符串:md5(“incrediman1234”)。然后假设您来到这里并需要输入我的用户名进行身份验证。您将输入“incrediman”,然后我会在哈希和验证之前附加“1234”,就像我最初哈希字符串时所做的一样。 - Cam
6个回答

18

MD5不是加密算法,而是哈希算法。它无法对字符串进行解密。

如果您要进行加密和解密,需要使用对称加密算法。它使用相同的密钥进行加密和解密。试图使用加密函数而不理解其工作原理是危险的。即使您认为自己理解了它们,也可能会犯错误。

如果要将数据传输到另一个人的服务器,最好使用像gpg之类的工具,使用电话协商达成共识后使用对称密钥加密文件,或者使用一些公钥加密技术。这样,您就不用编写任何加密代码,而且更安全(当然不是完全安全,但更安全)。


编辑:我仍在尝试理解您的要求。

MD5是一种无密码哈希函数——根本没有使用密钥。因此,假设服务器发送给您一个巨大的字符串或文件以及它的哈希值。您可以对该字符串或文件进行MD5处理,然后将您计算的哈希值与他们发送的哈希值进行比较。如果两者匹配,则数据在传输过程中没有损坏。但这并不意味着在传输过程中没有人对其进行篡改,因为MD5没有“秘密酱料”,任何人都可以对任意内容进行MD5处理并发送给您。

HMAC是一种带密钥哈希函数。它有一个只有您和通信组成员知道的秘密“配方”——密钥。如果他们向您发送一个长字符串或文件以及一个HMAC,您可以自己计算HMAC并将其与他们的HMAC进行比较。如果两者匹配,则数据在传输过程中未被损坏且未被篡改


2

MD5是一种哈希函数,严格来说不用于对字符串进行“加密”。它生成一个128位的“消息摘要”(因此名称中有MD),用作输入字符串的指纹。


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);
    }

这是因为Assert.AreEqual正在检查引用相等性:hash1和hash2是不同的对象,因此您的测试失败了。但是,如果您查看hash1和hash2的内容,您会发现它们包含完全相同的字节集。 - Chris Gillum

0

0

您可以使用C#中的AES来进行所需的加密类型。这里有一篇文章介绍如何操作。


0
你应该使用从SymmetricAlgorithm继承的类之一,例如:
  • AesCryptoServiceProvider
  • DESCryptoServiceProvider
  • RC2CryptoServiceProvider
  • TripleDESCryptoServiceProvider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接