为什么会出现在.NET框架没有管理MD5实现?(Why is there no managed MD

2019-07-31 02:00发布

(重新编写问题,请参阅历史原貌)。

现在的问题是正确的,在标题。

为什么会出现在.NET框架没有管理MD5实现?

我专门谈论一个纯粹的托管代码实现MD5算法,它不会在.NET框架中存在的。

内System.Security.Cryptography命名空间,我知道了MD5抽象基类(其中有被继承,不能直接使用),并且我也知道MD5CryptoServiceProviderMD5CNG而对此提供实现从OS的基础CSP(加密服务提供商)和CNG(下一代加密)提供商分别,但是,这两种实现都非托管代码。

UPDATE ON解答:
我对此表示赞赏,同时也应该是 “一个真正的答案”这个问题,我们(SO社区)可能不知道它,除非微软框架设计者(或谁直接知道一个)是这个社会的一部分,然而,许多人已经提供了非常合理的“猜测”如到走进省略从框架管理的MD5实现思想,但是,我还是想知道,如果有人不知道“真实”这个问题的答案。

Answer 1:

由于我没有设计的框架,我不能肯定地说,但我相信他们可能并没有为了阻止其出于安全原因使用麻烦。

我原本认为,非托管的执行速度会更快,但我们现在知道这是不是这种情况,请参见: https://stackoverflow.com/a/14850676/58391

我的下一个最好的猜测什么帕维尔说,在上述意见一致。 正如在.NET和C#大部分功能,有可能只是没有足够的好处超过成本来实现,测试和出货的功能时,底层的非托管一个就够已经很好了。

看到虽然从别人谁设计语言中的真正的答案会很有趣。



Answer 2:

MD5CryptoServiceProvider一直在.NET Framework从一开始,实际上是:

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

需要注意的是其封装了哈希算法所有的.NET BCL类继承的HashAlgorithm类,所以这些可以使用多态...

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

...和不同的实现可以依赖注入到你的代码:

public HashAlgorithm HashAlgorithm { get; set; }

编辑

啊哈,我明白了。 与MD5的事情(这是纯粹的猜测)是,它是最广泛使用的散列算法之一,被这样的,要求其实施符合一定的标准-更具体地说, FIPS 140-1 。 请参阅此获取更多信息。



Answer 3:

这完全是基于阅读许多帖子来自各种Microsoft博客(尽管不是谁做出这个决定的特定的人)的猜测。 有一个在.NET框架,因为没有管理的MD5实现:

1)实现已经可以从非托管的Windows加密API,他们负担不起,或者更可能觉得他们有更重要的事情做多,投入资源实现的东西,已经可以从下面的非托管实现包裹。 更深入地了解他们为什么会做出这个决定可以通过阅读找到多少微软的员工没有考虑改变一个灯泡? , 减去100点 (适用于C#编译器,但表明消费资源,他们最擅长做的相同的心态), 为什么不C#实现“顶级”的方法呢? (另一种看单个功能所需的资源)和功能默认情况下不存在 (从链接在此 )。 这些答案都不对的具体问题,但他们都证明,编写新的代码需要大量的资源,可能在其他地方可能会更好一些资源。 你可以争辩说,包装的底层非托管代码仍然需要资源,但我不认为有任何疑问,也就没有重新编写代码这已经是可用的,经过测试,和工作是净储蓄。

2)之后,或者可能在同一时间附近, 研究证明针对MD5的碰撞攻击的可行性 。 在这一点上,已经很高栏已经MD5重新托管代码编写可能得到更高。 一旦安全开发生命周期决定不使用禁用加密我能想象MD5的托管版本将是他们会投入资源的最后一件事。

虽然我的回答完全是炒作,这是不难理解的资源和功能的大名单,甚至微软限制了他们希望包括。 选择必须作出这些决定几乎总是将影响开发商的某一部分。

最后,你说自己有第三方MD5Managed类,或者你总是可以滚你自己 。 MD5的托管版本可能是一个“ 5分钟功能 ”,但如果真的是,那么作为程序员,我们可以把它写自己。



Answer 4:

MD5是不适合于除了可能误差检测传输错误任何加密或文件验证目的。 这可能是为了让人们转移到更好的散列像SHA-1或最好SHA-256。

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



Answer 5:

你在说什么?

System.Security.Cryptography.MD5
System.Security.Cryptography.MD5CryptoServiceProvider



Answer 6:

在.NET中任何在CryptoServiceProvider结束封装了非托管Windows加密API。 凡是在托管结束是在托管语言编写的。 链接文本

正如其他人说你不应该再使用MD5。 您应该使用SHA-256,其在.NET中有一个托管实现。 你是好去向上交易到更好的算法。 (编辑)由于MD5不再洁净,有这个在.NET的更高版本更新的机会不大,你不应该再使用它反正是完全管理。



Answer 7:

它一直在那里,因为开始时

// 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();


文章来源: Why is there no managed MD5 implementation in the .NET framework?