Nonsecure parameters for key generation

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

Описание

Этот дефект возникает при попытке генерации ключа при помощи EVP_PKEY_CTX контекстный объект, который связан со слабыми параметрами. То, что составляет слабый параметр, зависит от используемого алгоритма открытого ключа. В алгоритме DSA слабый параметр может быть результатом установки недостаточной длины параметра.

Например, вы устанавливаете количество битов, используемых для генерации параметра DSA, равным 512 битам, а затем используете параметры для генерации ключа:

EVP_PKEY_CTX *pctx,*kctx;
EVP_PKEY *params, *pkey;

/* Initializations for parameter generation */
pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_DSA, NULL);
params = EVP_PKEY_new();

/* Parameter generation */
ret = EVP_PKEY_paramgen_init(pctx);
ret = EVP_PKEY_CTX_set_dsa_paramgen_bits(pctx, KEYLEN_512BITS);
ret = EVP_PKEY_paramgen(pctx, &params);

/* Initializations for key generation */
kctx = EVP_PKEY_CTX_new(params, NULL);
pkey = EVP_PKEY_new();

/* Key generation */
ret = EVP_PKEY_keygen_init(kctx);
ret = EVP_PKEY_keygen(kctx, &pkey);

Риск

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

Зафиксировать

В зависимости от алгоритма используйте эти параметры:

  • Диффи-Хеллман (DH): Установите длину простого параметра DH равной 2048 битам.

    ret = EVP_PKEY_CTX_set_dh_paramgen_prime_len(pctx, 2048); 
    Установите генератор DH равным 2 или 5.
    ret = EVP_PKEY_CTX_set_dh_paramgen_generator(pctx, 2);

  • Алгоритм цифровой подписи (DSA): Установите количество битов, используемых для генерации параметров DSA, равным 2048 битам.

    ret = EVP_PKEY_CTX_set_dsa_paramgen_bits(pctx, 2048); 
    

  • RSA: Установите длину ключа RSA равной 2048 битам.

    ret = EVP_PKEY_CTX_set_rsa_keygen_bits(kctx, 2048);

  • Эллиптическая кривая (EC): Избегайте использования кривых, которые, как известно, разрушены, например X9_62_prime256v1. Используйте, например, sect239k1.

    ret = EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx, NID_sect239k1);
    

Примеры

расширить все

#include <stddef.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>

#define fatal_error() exit(-1)

int ret;
int func(EVP_PKEY *pkey){
  EVP_PKEY_CTX * ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL); 
  if (ctx == NULL) fatal_error();

  ret = EVP_PKEY_keygen_init(ctx);
  if (ret <= 0) fatal_error();
  ret = EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 512); 
  if (ret <= 0) fatal_error();
  return EVP_PKEY_keygen(ctx, &pkey); 
}

В этом примере генерация ключа RSA использует 512 биты, что делает сгенерированный ключ уязвимым для атак.

Коррекция - Используйте 2048 бит

Используйте 2048 бит для генерации ключа RSA.

#include <stddef.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>

#define fatal_error() exit(-1)

int ret;
int func(EVP_PKEY *pkey){
  EVP_PKEY_CTX * ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL); 
  if (ctx == NULL) fatal_error();

  ret = EVP_PKEY_keygen_init(ctx);
  if (ret <= 0) fatal_error();
  ret = EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 2048); 
  if (ret <= 0) fatal_error();
  return EVP_PKEY_keygen(ctx, &pkey); 
}

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

Группа: Криптография
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки : CRYPTO_PKEY_WEAK_PARAMS
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 310, 326, 327, 522
Введенный в R2018a