代码之家  ›  专栏  ›  技术社区  ›  CraigTP

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

  •  11
  • CraigTP  · 技术社区  · 15 年前

    (重新书写的问题,请参阅历史原件)。

    问题就在标题中。

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

    我说的是 纯托管代码 实现.NET框架中不存在的MD5算法。

    在system.security.cryptography命名空间中,我知道 MD5 抽象基类(必须继承,不能按原样使用),我还知道 MD5CryptoServiceProvider服务提供商 Md5CNG 它们分别提供操作系统的底层CSP(加密服务提供者)和CNG(下一代加密技术)提供者的实现,但是,这两种实现都是 非受管的 代码。

    答案更新:
    我很感激在那里 应该是 对于这个问题,“一个真正的答案”,我们(SO社区)可能不知道,除非一个微软框架设计师(或直接认识的人)是这个社区的一部分,但是,许多人已经提供了非常合理的“有教育意义的猜测”,关于从框架中省略管理的MD5实现的想法,但是,我是仍然好奇是否有人知道这个问题的“真实”答案。

    7 回复  |  直到 12 年前
        1
  •  8
  •   Community CDub    7 年前

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

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

    我的下一个最佳猜测与帕维尔在上述评论中所说的一致。与.NET和C中的大多数功能一样,在底层的非托管功能已经足够好的情况下,实现、测试和交付该功能可能没有足够的成本优势。

    不过,从设计语言的人那里看到一个真正的答案是很有趣的。

        2
  •  14
  •   Anton Gogolev    15 年前

    MD5CryptoServiceProvider 从第一天起就在.NET框架中,实际上:

    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 . 见 this 更多信息。

        3
  •  4
  •   Grant Wagner    15 年前

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

    1)非托管Windows Crypto API已经提供了一个实现,他们负担不起,或者更可能认为他们有更好的事情要做,而不是投入资源来实现那些可以从底层非托管实现中打包出来的东西。阅读以下内容,可以了解他们为什么会做出这个决定。 How many Microsoft employees does it take to change a lightbulb? , Minus 100 points (适用于C编译器,但展示了在资源发挥最大作用的地方花费资源的相同心态) Why Doesn't C# Implement "Top Level" Methods? (再看一下单个功能所需的资源)和 features don't exist by default (从 here )这些都没有回答具体的问题,但它们都表明编写新代码需要大量的资源,这些资源可能更好地用于其他地方。您可以争辩说包装底层的非托管代码仍然需要资源,但我不认为有任何疑问,如果不重新编写已经可用、测试和工作的代码,将会节省净成本。

    2)以后,或可能接近同一时间, research proved the feasibility of collision attacks against MD5 .在这一点上,用托管代码重新编写MD5的门槛可能会更高。一旦规定了安全开发生命周期 don't use banned crypto 我可以想象,MD5的托管版本将是他们投入资源的最后一件事。

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

    最后,您自己说有第三方MD5管理类,或者您可以始终 roll your own . MD5的托管版本可能是“ five minute feature “,但如果它真的是,那么作为程序员,我们可以自己编写它。

        4
  •  2
  •   clemahieu    15 年前

    MD5不适用于任何加密或文件验证目的,除了可能的错误检测传输错误。这可能是一个努力,让人们转移到更好的哈希,如sha-1或更可取的sha-256。

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

        6
  •  1
  •   scottheckel    15 年前

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

    正如其他人所说,你不应该再使用MD5。您应该使用在.NET中具有托管实现的SHA-256。你可以用更好的算法进行交易。(编辑)由于MD5不再是犹太洁食者,因此在.NET的较新版本中,几乎没有机会对其进行完全管理,因为无论如何您都不应该再使用它。

        7
  •  -1
  •   monkey_p    15 年前

    从一开始就在那里

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