Незащищенный хеш-алгоритм

Контекст, используемый для создания дайджеста сообщения, сопоставлен со слабым алгоритмом

Описание

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

Хеш-функции, отмеченные этим средством проверки, включают SHA 0, SHA-1, MD4, MD5 и RIPEMD-160. Средство проверки обнаруживает использование этих хеш-функций в:

  • Функции от API EVP, такие как EVP_DigestUpdate или EVP_SignUpdate.

  • Функции от API низкого уровня, такие как SHA1_Update или MD5_Update.

Риск

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

Фиксация

Используйте более безопасную хеш-функцию. Например, используйте более поздние функции SHA, такие как SHA-224, SHA-256, SHA-384 и SHA-512.

Примеры

развернуть все

#include <openssl/evp.h>

#define fatal_error() exit(-1)

int ret;
unsigned char *out_buf;
unsigned int out_len;

void func(unsigned char *src, size_t len, EVP_PKEY* pkey){
  EVP_MD_CTX* ctx = EVP_MD_CTX_create();

  ret = EVP_SignInit_ex(ctx, EVP_md5(), NULL);
  if (ret != 1) fatal_error();

  ret = EVP_DigestUpdate(ctx,src,len);

  if (ret != 1) fatal_error();

  ret = EVP_SignFinal(ctx, out_buf, &out_len, pkey);
  if (ret != 1) fatal_error();
}

В этом примере, во время инициализации с EVP_SignInit_ex, объект контекста сопоставлен со слабой хеш-функцией MD5. Средство проверки отмечает использование этого контекста на шаге обновления с EVP_DigestUpdate.

Исправление — функция семейства SHA-2 использования

Одно возможное исправление должно использовать хеш-функцию от семейства SHA-2, такого как SHA-256.

#include <openssl/evp.h>

#define fatal_error() exit(-1)

int ret;
unsigned char *out_buf;
unsigned int out_len;

void func(unsigned char *src, size_t len, EVP_PKEY* pkey){
  EVP_MD_CTX* ctx = EVP_MD_CTX_create();

  ret = EVP_SignInit_ex(ctx, EVP_sha256(), NULL); 
  if (ret != 1) fatal_error();

  ret = EVP_SignUpdate(ctx, src, len); 
  if (ret != 1) fatal_error();

  ret = EVP_SignFinal(ctx, out_buf, &out_len, pkey);
  if (ret != 1) fatal_error();
}

Информация о результате

Группа: криптография
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: CRYPTO_MD_WEAK_HASH
Влияние: носитель
ID CWE: 310, 327, 328, 353, 522

Введенный в R2018a