CNG, CryptoServiceProvider и управляемые реализации алгоритма хэширования
-
03-07-2019 - |
Вопрос
Итак, мне было интересно, есть ли какие-либо существенные различия между различными реализациями алгоритмов хэширования, возьмем, к примеру, серию алгоритмов SHA.Все они имеют по 3 реализации каждая, 1 в управляемом коде и 2 обертки вокруг различных собственных криптографических API, но есть ли какие-либо существенные различия между использованием любого из них?Я могу себе представить, что версии-оболочки могли бы иметь более высокую производительность, поскольку они выполняются в машинном коде, но все они должны выполнять одни и те же вычисления и, таким образом, выдавать один и тот же результат, т. е. они взаимозаменяемы.Правильно ли это?
Например, SHA512CNG нельзя использовать в XP SP2 (документы неверны), но SHA512MANAGED можно.
@Maxim - Спасибо, но это не совсем то, о чем я просил.Я спрашивал, есть ли какая-либо разница, кроме, возможно, производительности, от использования реализаций Managed / CryptoServiceProvider / CNG данного хэш-алгоритма.С .NET 3.5 вы получаете все алгоритмы хэширования с тремя реализациями, так что
Управляемый sha512 SHA512CryptoServiceProvider SHA512Cng
Последние два являются оболочками вокруг собственных API.Это верно, например, для всех реализаций SHAxxx.
Решение
Одно из отличий заключается в том, что собственные версии (по крайней мере, некоторые из них) сертифицированы FIPS (т. е. одобрены правительством США), в то время как управляемые - нет.Если ваш код запущен на компьютере с Windows, который был настроен как "только для FIPS", попытки использовать управляемые версии завершатся неудачей.
Большинство компьютеров с Windows не настроены таким образом, но если вы выполняете развертывание в правительственной или оборонной среде (или другой высокозащищенной), вы можете столкнуться с такой ситуацией.
Видишь http://blogs.msdn.com/shawnfa/archive/2005/05/16/417975.aspx.
Другие советы
Предполагается, что версии на КПГ немного быстрее, но я только что написал небольшую программу, которая сравнивает скорости каждой из них.(У меня был клиент, который спрашивал о характеристиках производительности 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
Я провел быстрое и грязное сравнение между 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%
Еще одним отличием между управляемой версией и версией CNG является поддерживаемая версия .Net Framework:например ,
- управляемая версия AES начинается с версии 3.5, в то время как CNG - с версии 4.6.2 и для
- SHA512, Управляемый начинается с 1.1 и СПГ начиная с 3.5.
Однако я считаю, что если мы не ограничены версией framework или для поддержки устаревших версий ОС, мы должны использовать Варианты использования на СПГ:
- Алгоритмы хеширования, постфиксированные с помощью Cng, являются единственными, которые используют bcrypt - шифрование
- Тот факт, что это может занять больше времени, на самом деле является преимуществом, поскольку защищает от атак грубой силы:на стороне пользователя 300 мс или 3 мс не имеет значения, в то время как для злоумышленника это величина порядка 100!