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 главный параметр к 2 048 битам.

    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 к 2 048 битам.

    ret = EVP_PKEY_CTX_set_dsa_paramgen_bits(pctx, 2048); 
    

  • RSA: Установите длину ключа RSA до 2 048 битов.

    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 битов, который делает сгенерированный ключ уязвимым для нападений.

Коррекция — Использование 2 048 битов

Используйте 2 048 битов для генерации ключей 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
Удар: носитель
ID CWE: 310, 326, 327, 522
Введенный в R2018a