为什么.NET框架中没有托管的MD5实现?

时间:2009-07-29 14:19:08

标签: .net hash cryptography

(重写的问题,请查看原文的历史记录。)

问题就在标题中。

为什么.NET框架中没有托管的MD5实现?

我特别谈到MD5算法的纯托管代码实现,这在.NET框架中不存在。

在System.Security.Cryptography命名空间内,我知道 MD5 抽象基类(必须继承,不能按原样使用),我也知道 MD5CryptoServiceProvider MD5CNG 分别提供来自操作系统的底层CSP(加密服务提供商)和CNG(加密下一代)提供商的实现,但是,这两种实现都是< strong>非托管代码。

更新答案:
我很欣赏,虽然应该“这个问题的”一个真正的答案“,但我们(SO社区)可能不知道它,除非Microsoft框架设计师(或直接认识一个人)是其中的一部分然而,这个社区,很多人提出了非常合理的“有根据的猜测”,从框架中省略了管理MD5实现的想法,但是,我仍然很想知道是否有人知道“真正的”答案这个问题。

7 个答案:

答案 0 :(得分:14)

从第一天起,

MD5CryptoServiceProvider一直在.NET Framework中,实际上是:

byte[] hash = new MD5CryptoServiceProvider().
    ComputeHash(Encoding.ASCII.GetBytes("Hello World!"));

请注意,封装散列算法的所有.NET BCL类都继承自HashAlgorithm类,因此可以多态使用这些类...

public byte[] ComputeHash(byte[] buffer, HashAlgorithm hashAlgorithm)
{ ...

...并且不同的实现可以是Dependency-Injected到您的代码中:

public HashAlgorithm HashAlgorithm { get; set; }

修改

啊,啊,我明白了。 MD5(这是纯粹的推测)是它是最广泛使用的散列算法之一,因此,它的实现需要符合某些标准 - 更具体地说,FIPS 140-1。有关详细信息,请参阅this

答案 1 :(得分:8)

由于我没有设计框架,我不能肯定地说,但我相信他们可能不会为了出于安全原因而不鼓励使用它。

我原本认为非托管实现会更快,但我们现在知道情况并非如此,请参阅:https://stackoverflow.com/a/14850676/58391

我的下一个最佳猜测与Pavel在上述评论中所说的一致。与.NET和C#中的大多数功能一样,当底层非托管功能已经足够好时,实现,测试和发布功能可能没有足够的成本优势。

从设计语言的人那里看到真正的答案会很有趣。

答案 2 :(得分:4)

这完全是基于阅读来自各个微软博主的帖子(尽管不是做出这个决定的特定人)的推测。 .NET框架中没有托管的MD5实现,因为:

1)已经可以从非托管Windows Crypto API获得一个实现,他们无法负担,或者更有可能觉得他们有更好的事情可做,而是投入资源来实现已经从底层非托管中包装的东西实现。通过阅读How many Microsoft employees does it take to change a lightbulb?Minus 100 points(适用于C#编译器,但展示了在他们做得最好的情况下花费资源的相同心态),可以更深入地了解他们为何做出此决定的原因,{{3 (另一个查看单个功能所需的资源)和Why Doesn't C# Implement "Top Level" Methods?(从features don't exist by default链接)。这些都没有回答具体问题,但它们都表明编写新代码需要大量资源,可能更好地在其他地方使用的资源。您可以认为包装底层的非托管代码仍然需要资源,但我不认为通过不重写已经可用,测试和工作的代码来节省净额。

2)稍后,或可能在同一时间,here。那时,用托管代码重写MD5的高标准可能会更高。一旦安全开发生命周期决定research proved the feasibility of collision attacks against MD5,我可以想象MD5的托管版本将是他们投入资源的最后一件事。

虽然我的回答完全是猜测,但不难理解,即使微软拥有有限的资源和他们希望包含的大量功能。必须做出选择,这些决定几乎总会影响某一部分开发人员。

最后,您说自己有第三方MD5管理课程,或者您可以随时don't use banned crypto。 MD5的托管版本可能是“roll your own”,但如果确实如此,那么作为程序员,我们可以自己编写。

答案 3 :(得分:2)

MD5不适用于任何加密或文件验证目的,除非可能检测到错误传输错误。这可能是为了让人们转向更好的哈希,比如SHA-1或更好的SHA-256。

http://www.mscs.dal.ca/~selinger/md5collision/

答案 4 :(得分:1)

答案 5 :(得分:1)

在.NET中,以CryptoServiceProvider结尾的任何内容都包装了非托管Windows Crypto API。以Managed结尾的任何内容都完全用托管语言编写。 link text

正如其他人所说,你不应再使用MD5了。您应该使用SHA-256,它在.NET中具有托管实现。你很高兴去交易更好的算法。 (编辑)由于MD5不再是犹太教,因此在更高版本的.NET中更新它的可能性很小,因为你不应该再使用它了。

答案 6 :(得分:-1)

从一开始就一直存在

// Create a new instance of the MD5CryptoServiceProvider object.
MD5 md5Hasher = MD5.Create();

// Convert the input string to a byte array and compute the hash.
byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));

// Create a new Stringbuilder to collect the bytes
// and create a string.
StringBuilder sBuilder = new StringBuilder();

// Loop through each byte of the hashed data 
// and format each one as a hexadecimal string.
for (int i = 0; i < data.Length; i++)
{
    sBuilder.Append(data[i].ToString("x2"));
}

// Return the hexadecimal string.
string hexMD5hash = sBuilder.ToString();