5

我一直在寻找一种在 C# 中使用预定键对给定字符串进行散列的方法。

在我通过互联网尝试寻找示例的冒险中,我看到了许多 MD5CryptoServiceProvider 示例,这些示例似乎使用机器的默认密钥,但没有一个应用特定密钥。我需要一个特定的密钥来编码数据,以便将其同步到其他人的服务器。我给他们一个散列字符串和一个 ID 号,他们使用它分析数据并返回一个类似的集合给我。那么无论如何要让 md5 通过一个对两者都一致的特定键来散列。

我更希望在 C# 中完成此操作,但如果使用库无法做到这一点,您是否可以使用 php 或 asp 等一些 Web 语言来做到这一点?

编辑:误解了我陷入的场景,坐了一会儿,思考了为什么他们会让我使用密钥,看来他们希望将密钥附加到字符串的末尾并进行哈希处理。这样,服务器可以将它所拥有的密钥与传递的数据一起附加,以确保它是一台有效的访问计算机。总之……谢谢大家^_^

Edit2:正如我在下面的评论中所说,我没有注意到“盐腌”这个词。哦,被扔进没有方向的新事物的乐趣。

4

6 回答 6

18

MD5 不是加密——它是一个散列。它不允许解密字符串。

您正在寻找一种对称加密算法。它使用相同的密钥来加密和解密。试图在不了解加密函数的情况下使用它们是危险的。即使你认为你理解它们,你也可能犯错误。

如果您要将数据传输到另一个人的服务器,最好使用gpg之类的东西来加密文件,使用双方通过电话同意的对称密钥,或者一些公钥加密。这样,您无需编写任何加密代码,而且更安全(请注意,并非完全安全,但更安全)。


编辑:我仍在尝试破译您的要求。

MD5 是一个无密钥的散列函数——根本没有使用密钥。因此,假设服务器向您发送了一个巨大的字符串或文件,以及它的哈希值。然后,您将对字符串或文件进行 MD5,并将您计算的哈希与他们发送的哈希进行比较。如果它们匹配,则数据在传输过程中没有损坏。这并不意味着没有人篡改他们在运输途中发送给您的东西,因为 MD5 没有“秘诀”。我可以 md5 任何我想要的东西并发送给你。

HMAC 是一个键控散列函数。它有一个秘密成分,只有您和您正在与之通信的小组应该知道 - 密钥。如果他们向您发送一个长字符串或文件和一个 HMAC,您可以自己计算 HMAC,比较您的 HMAC 和他们的 HMAC,如果它们匹配,则数据在传输过程中没有损坏,数据也没有被篡改

于 2009-07-06T19:59:49.990 回答
2

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

于 2009-07-06T20:01:18.927 回答
0

汤姆是对的:MD5 只是一个单向哈希,你不能解密它。试试这些链接:

于 2009-07-06T20:02:27.427 回答
0

您可以使用 C# 中的 AES 来执行您正在寻找的加密类型。这是一篇关于如何的文章。

于 2009-07-06T20:02:40.717 回答
0

您应该使用继承自的类之一SymmetricAlgorithm,例如:

  • AesCryptoServiceProvider
  • DESCryptoServiceProvider
  • RC2CryptoServiceProvider
  • TripleDESCryptoServiceProvider
于 2009-07-06T20:06:31.070 回答
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);
    }
于 2010-04-18T18:00:58.103 回答