Существует ли альтернативный алгоритм хеширования MD5 для систем с поддержкой FIPS?

Всякий раз, когда я пытаюсь использовать MD5 на компьютере с Windows XP с включенным FIPS, я получаю ошибку System.InvalidOperationException.

Есть ли альтернативный алгоритм, который я должен использовать вместо MD5 на FIPS?


person qazwsx    schedule 03.02.2011    source источник
comment
БЫСТРОЕ ПРИМЕЧАНИЕ. Если на вашем Windows Server включена политика алгоритмов FIPS, поставщики криптографии по умолчанию, расположенные в библиотеке System.Cryptography, будут ОТКЛЮЧЕНЫ. Помните об этом при выборе решений, потому что провайдеры System.Cryptography БОЛЬШЕ НЕ будут доступны. ПОСМОТРЕТЬ СТАТУС ПОЛИТИКИ: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\fipsalgorithmpolicy   -  person Prisoner ZERO    schedule 08.02.2017
comment
Этот ответ на повторяющийся вопрос предоставляет альтернативу.   -  person Frédéric    schedule 16.07.2018


Ответы (3)


MD5 не соответствует требованиям FIPS. Вы можете использовать вместо MD5 один из следующих алгоритмов хеширования:

person Borja    schedule 04.02.2011
comment
HMACSHA1 и MACTripleDES имеют ключи и служат другим целям, чем простые хэши. На самом деле они не являются прямой заменой MD5. - person LukeH; 04.02.2011
comment
Вы правы, но использования постоянного ключа может быть достаточно, чтобы заменить его. SHA1CryptoServiceProvider, вероятно, является наиболее подходящим в этом случае. Всем HMACSHAxxx нужен ключ :( - person Borja; 04.02.2011
comment
Работа с SHA1CryptoServiceProvider - person qazwsx; 04.02.2011
comment
@qazwsx: Почему вы решили не идти с SHA512CryptoServiceProvider? Как я уже говорил, я не могу придумать убедительной причины не использовать SHA512. Это намного безопаснее, чем SHA1, который почти наверняка не рекомендуется профессионалами в области безопасности. Я предполагаю, что будущие реализации FIPS также запретят это. - person Cody Gray; 05.02.2011
comment
MD5 - это 128-битный алгоритм, поэтому, если md5 было достаточно, sha1 тоже будет достаточно, потому что это тоже 128-битный алгоритм. Это правда, что sha1 не очень безопасный алгоритм хеширования, может быть, мы можем сказать, что он небезопасен, и, может быть, это правда, но он, по крайней мере, более безопасен, чем исходный алгоритм, MD5. В некоторых приложениях, где вы хотите иметь только не простой текст, может быть достаточно, это быстро и мало. Вы всегда можете использовать самую сильную версию алгоритма sha, как вы предлагаете, если безопасность важна, вы должны это сделать. - person Borja; 05.02.2011
comment
@Borja: Может быть, ты не читал вопрос. MD5 было недостаточно. Он не соответствует стандартам FIPS по определенной причине. Нет абсолютно никаких причин использовать что-либо, кроме самого безопасного из возможных алгоритмов. Это не требует дополнительной работы, оно уже встроено в фреймворк. Все, что вам нужно сделать, это ввести другой номер. Я действительно не знаю, что вы говорите о том, что SHA1 более безопасен, чем обычный текст. Да, конечно, но это не стандарт, по которому мы измеряем шифрование. Это вообще плохой совет. - person Cody Gray; 09.02.2011
comment
@CodyGray просто неверно, что «нет абсолютно никаких причин использовать что-либо, кроме самого безопасного алгоритма» - безопасность всегда является компромиссом, и в зависимости от приложения вам необходимо учитывать такие вещи, как производительность, требования к хранилищу и совместимость. - person Cocowalla; 20.08.2012
comment
@Cody Grey: Иногда хэши - это просто хэши для сравнения отпечатков пальцев, а не хэши, связанные с безопасностью или паролями. - person Scott Stafford; 11.09.2014
comment
Помните о контексте, @Scott. Вопрос в том, чтобы соответствовать обязательным стандартам FIPS. - person Cody Gray; 12.09.2014
comment
Я наткнулся на этот пост, потому что выполняю развертывание на машине с мандатом FIPS. Здесь конкретный вариант использования не требует надежной криптографической защиты, даже если машина просто заносит MD5 в черный список. Что, в моем случае, за борт и неприятность. - person Scott Stafford; 12.09.2014
comment
Я вижу черный список MD5 для новых хэшей ... но можете ли вы проверить хэш MD5, который был РАНЕЕ СОЗДАН, когда MD5 все еще рекомендовался? - person Jens Fiederer; 04.03.2019
comment
@JensFiederer ответ - нет. Вам разрешено использовать только проверенные методы FIPS. Например, когда вы включаете режим FIPS в Windows, он фактически блокирует определенные функции, такие как MD5, поэтому программа просто выйдет из строя, если не ожидает, что хэш вызовет исключение. Происходит постоянно. - person HackSlash; 11.03.2021

Когда вы обеспечиваете соответствие FIPS в параметрах политики безопасности Windows, вы утверждаете, что собираетесь использовать только сертифицированные FIPS алгоритмы шифрования и хеширования. MD5 не является одним из этих утвержденных алгоритмов хеширования, поэтому возникает исключение.

Обходной путь прост: выберите другой алгоритм хеширования. .NET Framework предоставляет множество других параметров в System.Security.Cryptography пространстве имен. Выберите один из алгоритмов семейства SHA. Я не могу представить себе никакой причины, по которой вам пришлось бы использовать MD5, а не одну из альтернатив.

person Cody Gray    schedule 03.02.2011
comment
Все ли они совместимы с FIPS или какая из них является лучшей альтернативой MD5, совместимой с FIPS? - person qazwsx; 04.02.2011
comment
@qazwsx: любой из семейства SHA соответствует требованиям FIPS. Они отсортированы на странице в алфавитном порядке, поэтому вы увидите всю группу внизу. Я не знаю веских причин не использовать SHA512. - person Cody Gray; 04.02.2011
comment
@CodyGray Я не могу представить, по какой причине вам придется использовать MD5, а не одну из альтернатив. При взаимодействии со сторонней системой, которая хочет что-то хешировать MD5. - person Micah Zoltu; 09.07.2015
comment
Если на вашем Windows Server включена политика алгоритмов FIPS, поставщики криптографии по умолчанию, расположенные в библиотеке System.Cryptography, будут ОТКЛЮЧЕНЫ. - person Prisoner ZERO; 08.02.2017

Вы можете использовать MD5Digest из Org.BouncyCastle.Crypto.Digests.

MD5Digest hash = new MD5Digest();

public byte[] Hash(byte[] input)
{
     hash.BlockUpdate(input, 0, input.Length);
     byte[] result = new byte[hash.GetDigestSize()];
     hash.DoFinal(result, 0);
     return result;
}

public string Hash(string input)
{
     var data = System.Text.Encoding.Unicode.GetBytes(input);
     hash.BlockUpdate(data, 0, data.Length);
     byte[] result = new byte[hash.GetDigestSize()];
     hash.DoFinal(result, 0);

     return Hex.ToHexString(result).ToUpper();
}
person ManishM    schedule 04.09.2018
comment
Это лучший ответ на вопрос, который я где-либо видел. - person Mike Godin; 05.12.2019
comment
Вы можете использовать его, и он не будет ошибаться, но он НЕ совместим с fips. - person Brian White; 15.04.2020