Почему в .NET Framework нет управляемой реализации MD5? - PullRequest
11 голосов
/ 29 июля 2009

(Переписанный вопрос, пожалуйста, посмотрите историю для оригинала).

Вопрос прямо в заголовке.

Почему в .NET Framework нет управляемой реализации MD5?

Я специально говорю о чисто управляемом коде реализации алгоритма MD5, которого нет в .NET Framework.

В пространстве имен System.Security.Cryptography мне известен абстрактный базовый класс MD5 (который должен быть унаследован и не может использоваться как есть), и я также осведомлен о MD5CryptoServiceProvider и MD5CNG , которые оба предоставляют реализации от базовых поставщиков CSP (поставщик услуг шифрования) и CNG (Cryptography Next Generation) соответственно, однако обе эти реализации неуправляемы код.

ОБНОВЛЕНИЕ ОТВЕТОВ:
Я ценю, что, хотя должно быть"одним верным ответом" на этот вопрос, мы (сообщество SO), возможно, не узнаем его, если разработчик фреймворка Microsoft (или кто-то, кто знает его непосредственно) не является частью этого Тем не менее, в сообществе многие люди предложили очень разумные «образованные догадки» относительно мышления, которое привело к исключению управляемой реализации MD5 из фреймворка, однако мне все еще интересно знать, знает ли кто-нибудь «реальный» ответ на этот вопрос. вопрос.

Ответы [ 7 ]

14 голосов
/ 29 июля 2009

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; }

EDIT

Ага, понятно. Что касается MD5 (это чистое предположение), это то, что он является одним из наиболее широко используемых алгоритмов хеширования, и для его реализации требуется соответствие определенным стандартам - в частности, FIPS 140-1, См. this для получения дополнительной информации.

8 голосов
/ 29 июля 2009

Так как я не проектировал структуру, я не могу сказать наверняка, но я полагаю, что они, вероятно, не беспокоились, чтобы препятствовать ее использованию по соображениям безопасности.

Изначально я считал, что неуправляемая реализация будет быстрее, но теперь мы знаем, что это не так, см .: https://stackoverflow.com/a/14850676/58391

Моя следующая лучшая догадка совпадает с тем, что говорит Павел в комментариях выше. Как и в случае с большинством функций в .NET и C #, вероятно, просто не хватило выгоды по сравнению с затратами на реализацию, тестирование и поставку функции, когда базовая неуправляемая уже была достаточно хороша.

Было бы интересно увидеть реальный ответ от кого-то, кто разработал язык.

4 голосов
/ 30 июля 2009

Это полностью спекуляция, основанная на прочтении многих постов от различных блоггеров Microsoft (хотя не от конкретного человека, который принял это решение). В .NET Framework нет управляемой реализации MD5, потому что:

1) Реализация уже была доступна из неуправляемого API-интерфейса Windows Crypto, и они не могли себе позволить или, скорее всего, чувствовали, что у них есть дела получше, чем выделять ресурсы для реализации чего-то, что уже можно было перенести из лежащего в основе неуправляемого реализация. Чтобы лучше понять, почему они могут принять это решение, прочитайте Сколько сотрудников Microsoft требуется, чтобы заменить лампочку? , Минус 100 баллов (относится к компилятору C #, но демонстрирует тот же способ тратить ресурсы там, где они приносят наибольшую пользу), Почему C # не реализует методы "верхнего уровня"? (еще один взгляд на ресурсы, необходимые для одной функции) и функции не существует по умолчанию (связано с здесь ). Ни один из этих ответов не отвечает на конкретный вопрос, но все они демонстрируют, что для написания нового кода требуется много ресурсов, ресурсов, которые лучше потратить в других местах. Вы можете утверждать, что для обертывания лежащего в основе неуправляемого кода по-прежнему требуются ресурсы, но я не думаю, что есть какие-либо сомнения в том, что будет чистая экономия, если не переписывать код, который уже доступен, протестирован и работает.

2) Позднее или, возможно, почти в то же время, исследования подтвердили возможность столкновений с MD5 . В этот момент и без того высокая планка переписывания MD5 в управляемом коде, вероятно, стала еще выше. После того, как жизненный цикл разработки безопасности продиктовал не использовать запрещенную криптографию , я могу представить, что управляемая версия MD5 станет последней вещью, которой они будут посвящать ресурсы.

Хотя мой ответ полностью спекулятивный, нетрудно понять, что даже у Microsoft ограниченные ресурсы и большой список функций, которые они хотели бы включить. Выбор должен быть сделан, и эти решения почти всегда влияют на определенный сегмент разработчиков.

В заключение вы сказали, что существуют сторонние MD5Managed классы, или вы всегда можете свернуть свои . Управляемая версия MD5 может быть « пятиминутная функция », но если это действительно так, то, как программисты, мы можем написать это сами.

2 голосов
/ 29 июля 2009

MD5 не подходит для каких-либо целей криптографии или проверки файлов, за исключением возможных ошибок обнаружения ошибок передачи. Вероятно, это попытка заставить людей перейти к лучшим хэшам, таким как SHA-1 или предпочтительный SHA-256.

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

1 голос
/ 29 июля 2009

В .NET все, что заканчивается в CryptoServiceProvider, оборачивает неуправляемый Windows Crypto API. Все, что заканчивается в Managed, полностью написано на управляемом языке. текст ссылки

Как говорили другие люди, вы больше не должны использовать MD5. Вы должны использовать SHA-256, который в .NET имеет управляемую реализацию. Вы хорошо идете и торгуете по лучшему алгоритму. (РЕДАКТИРОВАТЬ) Так как MD5 больше не кошерный, маловероятно, что это будет обновлено в более поздней версии .NET, чтобы полностью управляться, так как вы больше не должны его использовать.

1 голос
/ 29 июля 2009
0 голосов
/ 29 июля 2009

Он был там с самого начала

// 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...