Незащищенные параметры для генерации ключей

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

Описание

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