一尘不染

我应该选择哪个加密哈希函数?

c#

.NET框架附带6种不同的哈希算法:

  • MD5:16个字节(散列时间500MB:1462毫秒)
  • SHA-1:20个字节(1644毫秒)
  • SHA256:32个字节(5618毫秒)
  • SHA3​​84:48个字节(3839毫秒)
  • SHA512:64个字节(3820毫秒)
  • RIPEMD:20个字节(7066 ms)

这些功能中的每个功能都有不同。MD5是最快的,而RIPEMD是最慢的。

MD5的优点是适合内置的Guid类型。它是类型3
UUID的基础
SHA-1哈希是类型5
UUID的基础。
这使得它们非常易于识别。

但是,MD5容易受到碰撞攻击,SHA-1也容易受到攻击,但是程度较小。

在什么情况下应该使用哪种哈希算法?

我真的很想知道答案的具体问题是:

  • MD5不值得信赖吗?在正常情况下,当您使用没有恶意意图的MD5算法并且任何第三方都没有恶意意图时,您会期望发生任何冲突(这意味着两个任意byte []会产生相同的哈希)

  • RIPEMD比SHA1好多少?(如果更好),其计算速度要慢5倍,但哈希大小与SHA1相同。

  • 在对文件名(或其他短字符串)进行哈希处理时,获得非恶意冲突的几率是多少?(例如,两个具有相同MD5哈希值的随机文件名)(带有MD5 / SHA1 / SHA2xx)通常,非恶意冲突的几率是多少?

这是我使用的基准:

    static void TimeAction(string description, int iterations, Action func) {
        var watch = new Stopwatch();
        watch.Start();
        for (int i = 0; i < iterations; i++) {
            func();
        }
        watch.Stop();
        Console.Write(description);
        Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
    }

    static byte[] GetRandomBytes(int count) {
        var bytes = new byte[count];
        (new Random()).NextBytes(bytes);
        return bytes;
    }


    static void Main(string[] args) {

        var md5 = new MD5CryptoServiceProvider();
        var sha1 = new SHA1CryptoServiceProvider();
        var sha256 = new SHA256CryptoServiceProvider();
        var sha384 = new SHA384CryptoServiceProvider();
        var sha512 = new SHA512CryptoServiceProvider();
        var ripemd160 = new RIPEMD160Managed();

        var source = GetRandomBytes(1000 * 1024);

        var algorithms = new Dictionary<string,HashAlgorithm>();
        algorithms["md5"] = md5;
        algorithms["sha1"] = sha1;
        algorithms["sha256"] = sha256;
        algorithms["sha384"] = sha384;
        algorithms["sha512"] = sha512;
        algorithms["ripemd160"] = ripemd160;

        foreach (var pair in algorithms) {
            Console.WriteLine("Hash Length for {0} is {1}", 
                pair.Key, 
                pair.Value.ComputeHash(source).Length);
        }

        foreach (var pair in algorithms) {
            TimeAction(pair.Key + " calculation", 500, () =>
            {
                pair.Value.ComputeHash(source);
            });
        }

        Console.ReadKey();
    }

阅读 387

收藏
2020-05-19

共1个答案

一尘不染

在密码学中,哈希函数提供三个单独的函数。

  1. 防冲突 :某人找到两条散列相同的消息( 任意 两条消息)有多困难。
  2. 图像前抵抗力 :给定一个散列,找到另一个散列相同的消息有多难?也称为 单向哈希函数
  3. 第二次原像抵抗 :给定一条消息,找到另一条散列相同的消息。

这些属性是相关但独立的。例如,抗碰撞性意味着第二原像抗性,但并非相反。对于任何给定的应用程序,您将有不同的要求,需要其中一个或多个属性。用于保护服务器密码的哈希函数通常只需要具有映像前抵抗力,而消息摘要则需要全部三个。

已经表明,MD5不是抗碰撞的,但是,这并不排除其在不需要抗碰撞的应用中的使用。确实,MD5仍经常用于较小的密钥大小和更快的速度的应用程序中。也就是说,由于其缺陷,研究人员建议在新方案中使用其他哈希函数。

SHA1的一个缺陷是,从理论上讲,发现冲突的长度远远小于其长度的安全哈希函数所需的2 ^ 80步。攻击正在不断修订,目前可以以〜2 ^ 63的步骤进行-
仅在当前可计算性范围内。因此,NIST正在逐步淘汰SHA1,并指出应在2010年之后使用SHA2系列。

SHA2是在SHA1之后创建的新的哈希函数系列。当前,尚无针对SHA2功能的已知攻击。SHA256、384和512都是SHA2系列的一部分,只是使用了不同的密钥长度。

对于RIPEMD,除了要注意它不像SHA系列那样普遍使用之外,我无可奉告,因此还没有受到密码研究人员的严格审查。仅出于这个原因,我建议在其上使用SHA函数。在实现中,您使用它的速度也似乎很慢,这使它的用处不大。

总之,没有最好的功能-这完全取决于您需要的功能。注意每个缺陷,您将最有可能为 您的 方案选择正确的哈希函数。

2020-05-19