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

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

Вопрос находится прямо в заголовке.

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

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

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

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

Ответ 1

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

Я изначально считал, что неуправляемая реализация будет быстрее, но теперь мы знаем, что это не так, см. fooobar.com/questions/17542/...

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

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

Ответ 2

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

ИЗМЕНИТЬ

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

Ответ 6

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

Как утверждают другие люди, вы больше не должны использовать MD5. Вы должны использовать SHA-256, который в .NET имеет управляемую реализацию. Вы хорошо пойдете и торгуете до лучшего алгоритма. (EDIT) Поскольку MD5 больше не кошерный, вероятность того, что обновление будет обновлено в более поздней версии .NET, будет полностью управляться, поскольку вы не должны использовать его в любом случае.

Ответ 7

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

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