exponenta event banner

Небезопасный хэш-алгоритм

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

Описание

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

Хеш-функции, отмеченные этой проверкой, включают в себя 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++
По умолчанию: Откл.
Синтаксис командной строки: CRYPTO_MD_WEAK_HASH
Воздействие: среднее
CWE ID: 310, 327, 328, 353, 522
Представлен в R2018a