CNG, CryptoServiceProvider и управляемые реализации HashAlgorithm

Поэтому мне было интересно, есть ли какие-либо существенные различия между различными реализациями хэш-алгоритмов, например, с серией алгоритмов SHA. Все они имеют по 3 реализации, 1 в управляемом коде и 2 оболочки для разных нативных криптографических API, но есть ли какие-либо существенные различия между использованием любого из них? Я могу представить, что версии оболочки могут иметь более высокую производительность, поскольку они выполняются в собственном коде, но, конечно, всем нужно выполнять точно такие же вычисления и, таким образом, обеспечивать тот же результат, т.е. они взаимозаменяемы. Это верно?

Например, SHA512CNG нельзя использовать в XP SP2 (документы неверны), но SHA512MANAGED можно.


@Maxim - Спасибо, но не совсем то, о чем я просил. Я спрашивал, есть ли какая-либо разница, кроме, возможно, производительности, от использования реализаций Managed / CryptoServiceProvider / CNG данного алгоритма хеширования. С .NET 3.5 вы получаете все хэш-алгоритмы с тремя реализациями, поэтому

SHA512Managed SHA512CryptoServiceProvider SHA512Cng

Последние два являются оболочками для собственных API-интерфейсов. Например, это верно для всех реализаций SHAxxx.

На этот раз я заметил, что одна из встроенных реализаций оболочки (шифрование, забыл, какая из них) дает разные результаты в XP SP1 и SP2. Это было довольно давно, когда я использовал .Net 1.1, поэтому вместо этого я прибег к использованию управляемой реализации, более «переносимой».

faulty 20.10.2008 16:28

Насколько мне известно, реализации оболочки (версии CryptoServiceProvider и CNG) не работают в XP SP2, несмотря на то, что в документации MSDN указано, что они работают. Я попробовал, и возникло исключение

TheCodeJunkie 21.10.2008 23:57

Вот несколько полезных ссылок на некоторые таблицы, в которых обобщены различные версии криптоклассов и места, где они поддерживаются: mytenpennies.wikidot.com/blog:cryptography-in-dot-net и geeklyeverafter.blogspot.com/2010/12/net-encryption-part-2.h‌ tml

luksan 03.03.2012 05:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
22
3
9 177
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Одно отличие состоит в том, что собственные версии (по крайней мере, некоторые из них) сертифицированы FIPS (т. Е. Утверждены правительством США), а управляемые - нет. Если ваш код выполняется на компьютере с Windows, который был настроен как «только FIPS», попытки использовать управляемые версии не удастся.

Большинство компьютеров с Windows не настроены таким образом, но при развертывании в правительственной или оборонной (или другой высокозащищенной) среде вы можете столкнуться с такой ситуацией.

См. http://blogs.msdn.com/shawnfa/archive/2005/05/16/417975.aspx.

Версии Cng должны быть немного быстрее, но я просто написал небольшую программу, которая сравнивает скорости каждой из них. (У меня был клиент, который спрашивал о характеристиках производительности MD5 по сравнению с SHA1)

Я был удивлен, обнаружив, что между MD5 и SHA1 практически нет разницы, но также был удивлен тем, что есть небольшая разница в Cng и CryptoServiceProvider.

Источник довольно прост, я добавил представителей для выполнения одной и той же итерации несколько раз, чтобы я мог усреднить, если что-то странное происходит на моей машине во время одного из прогонов.

вызовите следующее с помощью такого вызова:

CalculateHash(1, 1024, new SHA1CryptoServiceProvider());

static long CalculateHash(UInt64 repetitions, UInt64 size, HashAlgorithm engine)
    {
        RandomNumberGenerator rng = RandomNumberGenerator.Create();

        byte[][] goo = new byte[repetitions][];
        for (UInt64 i = 0; i < repetitions; i++)
        {
            goo[i] = new byte[size];
            rng.GetBytes(goo[i]);
        }

        DateTime start = DateTime.Now;
        for (UInt64 i = 0; i < repetitions; i++)
        {
            engine.ComputeHash(goo[i]);
        }
        return DateTime.Now.Subtract(start).Ticks;
    }

Я запускал это в цикле увеличивающегося размера, чтобы выяснить, упал ли один из них при использовании больших или малых входов. Вот цикл и следующие данные (у моего компьютера закончилась оперативная память на 2 ^ 28):

int loops = 32;
        UInt64 reps = 1;

        int width = 20;
        Console.WriteLine("Loop#".PadRight(6) +
                "MD5".PadRight(width) +
                "SHA1".PadRight(width) +
                "SHA1Cng".PadRight(width) +
                "SHA256".PadRight(width) +
                "SHA256Cng".PadRight(width));

        for (int i = 0; i < loops; i++)
        {
            UInt64 size = (UInt64)Math.Pow((double)2, (double)i);

            Console.WriteLine((i + 1).ToString().PadRight(6) +
                CalculateHash(reps, size, new MD5CryptoServiceProvider()).ToString().PadRight(width) +
                CalculateHash(reps, size, new SHA1CryptoServiceProvider()).ToString().PadRight(width) +
                CalculateHash(reps, size, new SHA1Cng() ).ToString().PadRight(width) +
                CalculateHash(reps, size, new SHA256CryptoServiceProvider()).ToString().PadRight(width) +
                CalculateHash(reps, size, new SHA256Cng()).ToString().PadRight(width));
        }

Loop# MD5         SHA1        SHA1Cng     SHA256      SHA256Cng
1     50210       0           0           0           0
2     0           0           0           0           0
3     0           0           0           0           0
4     0           0           0           0           0
5     0           0           0           0           0
6     0           0           0           0           0
7     0           0           0           0           0
8     0           0           0           0           0
9     0           0           0           0           0
10    0           0           10042       0           0
11    0           0           0           0           0
12    0           0           0           0           0
13    0           0           0           0           0
14    0           0           0           0           0
15    10042       0           0           10042       10042
16    10042       0           0           0           0
17    0           0           0           10042       10042
18    0           10042       10042       20084       10042
19    0           10042       10042       30126       40168
20    20084       20084       20084       70294       70294
21    30126       40168       40168       140588      140588
22    60252       70294       80336       291218      281176
23    120504      140588      180756      572394      612562
24    241008      281176      361512      1144788     1215082
25    482016      572394      723024      2289576     2420122
26    953990      1134746     1456090     4538984     4830202
27    1907980     2259450     2982474     9118136     9660404
28    3805918     4508858     5804276     18336692    19581900

DateTime не является точным, используйте секундомер для измерения времени, он использует счетчик производительности с высоким разрешением!

BerndK 11.09.2018 17:28

Я провел быстрое и грязное сравнение между CNG и managed на SHA512, который является самым медленным из всех алгоритмов SHA AFAIK, используя приведенный ниже код.

    static void Main(string[] args)
    {
      int loops = 10000000;
      var data = Encoding.ASCII.GetBytes("123");

      var hashLoop = new Action<HashAlgorithm>((HashAlgorithm ha) =>
      {
        for (int i = 0; i < loops; i++)
          ha.ComputeHash(data);
      });

      var t1 = Task.Factory.StartNew(() =>
      {
        Time(hashLoop, new SHA512Managed());
      });
      var t2 = Task.Factory.StartNew(() =>
      {
        Time(hashLoop, new SHA512Cng());
      });

      Task.WaitAll(t1, t2);
      Console.WriteLine("Benchmark done!");
      Console.ReadKey();
    }
    static void Time(Action<HashAlgorithm> action, HashAlgorithm ha)
    {
      var sw = new Stopwatch();
      sw.Start();
      action(ha);
      sw.Stop();
      Console.WriteLine("{1} done in {0}ms", sw.ElapsedMilliseconds, ha.ToString());
    }

После нескольких прогонов я обнаружил, что разница в том, что CNG был значительно быстрее, чем управляемая версия алгоритма примерно с 21.7% to 49.5%.

Интересный факт заключается в том, что вы фактически хочу ваши алгоритмы хеширования должны быть медленными, чтобы защитить вас от атак грубой силы. На стороне пользователя 300 мс или 3 мс не имеет значения, а для злоумышленника это величина порядка 100!

Ioanna 29.08.2018 12:56

Еще одно различие между версиями Managed и CNG - это поддерживаемая версия .Net Framework: например,

  • версия AES Managed начинается с 3.5, а CNG с 4.6.2 и для
  • SHA512, Удалось начинается с 1.1 и Cng с 3.5.

Однако я считаю, что если мы не ограничены версией фреймворка или поддерживаем устаревшие версии ОС, мы должны использовать Версии CNG:

  • Алгоритмы хеширования с постфиксом Cng - единственные, которые используют bcrypt
  • Тот факт, что это может занять больше времени, на самом деле является преимуществом, поскольку он защищает от атак грубой силы: на стороне пользователя 300 мс или 3 мс не имеют значения, в то время как для злоумышленника это величина порядка 100!

Другие вопросы по теме