【问题标题】:MD5 Hashing Given a Key in C#给定 C# 中的键的 MD5 散列
【发布时间】:2009-07-06 19:56:04
【问题描述】:

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

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

我更希望在 C# 中完成此操作,但如果使用库无法实现,您可以使用 php 或 asp 等网络语言来完成吗?

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

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

【问题讨论】:

  • MD5 没有密钥...正如 Tom Ritter 指出的那样,它不是加密算法
  • 正如每个人都指出的那样,MD5 是散列,而不是加密,但是从您的帖子中不清楚您是否真的确实想要散列和错误或真的想要加密。请澄清。
  • 您的编辑并没有真正澄清您的问题。 MD5 不使用您所询问的“预定密钥”。但是,如果您需要做的只是比较哈希值,那么只需获取两个输入的哈希值并逐位比较结果。请注意,MD5 通常(除了极不可能的哈希冲突情况)会给出完全不同的结果,即使输入变化最小。
  • 我认为他的意思是他想将字符串加盐以进行哈希处理。这样服务器就可以使用相同的盐来验证输入。
  • 是的,我查了盐腌,这就是我需要的。愚蠢的工作让我陷入了我完全忘记的事情。至少我学到了一些新东西吧。

标签: c# md5 hash


【解决方案1】:

MD5 不是加密——它是一个哈希。它不允许对字符串进行解密。

您正在寻找一种对称加密算法。它使用相同的密钥来加密和解密。尝试使用加密函数without understanding them is dangerous。即使你认为你理解它们,你也可能犯错误。

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


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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      Tom 是对的:MD5 只是一个单向哈希,您无法解密它。试试这些链接:

      【讨论】:

        【解决方案4】:

        您可以使用 C# 中的 AES 来执行您正在寻找的加密类型。这是an article 的说明。

        【讨论】:

          【解决方案5】:

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

          • AesCryptoServiceProvider
          • DESCryptoServiceProvider
          • RC2CryptoServiceProvider
          • TripleDESCryptoServiceProvider

          【讨论】:

            【解决方案6】:

            那么,如果两个输入字符串相同,为什么下面的测试会失败?

                [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 的内容,您会发现它们包含完全相同的字节集。
            猜你喜欢
            • 2012-06-17
            • 2013-08-29
            • 1970-01-01
            • 2020-07-06
            • 2011-06-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-15
            相关资源
            最近更新 更多