Predictable cipher key

Ключ шифрования или дешифрования генерируется из генератора слабых случайных чисел

Описание

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

Риск

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

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

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

Используйте сильный генератор псевдослучайных чисел (PRNG) для ключа. Для образца:

  • Используйте PRNG уровня ОС, такой как /dev/random в UNIX® или CryptGenRandom() в Windows®

  • Используйте PRNG прикладного уровня, такой как Advanced Encryption Standard (AES) в режиме счетчика (CTR), HMAC-SHA1 и т.д.

Список генераторов случайных чисел, которые являются криптографически слабыми, см. Vulnerable pseudo-random number generator.

Примеры

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


#include <openssl/evp.h>
#include <openssl/rand.h>
#include <stdlib.h>
#define SIZE16 16

int func(EVP_CIPHER_CTX *ctx, unsigned char *iv){
    unsigned char key[SIZE16];
    RAND_pseudo_bytes(key, 16);
    return EVP_CipherInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv, 1); 
}

В этом примере функция RAND_pseudo_bytes объявлен в openssl/rand.h задает ключ шифра. Однако последовательности байтов, которые RAND_pseudo_bytes генерация не обязательно непредсказуема.

Коррекция - Используйте сильный генератор случайных чисел

Одна возможная коррекция состоит в том, чтобы использовать сильный генератор случайных чисел, чтобы получить ключ шифра. Исправленный код здесь использует функцию RAND_bytes объявлен в openssl/rand.h.


#include <openssl/evp.h>
#include <openssl/rand.h>
#include <stdlib.h>
#define SIZE16 16

int func(EVP_CIPHER_CTX *ctx, unsigned char *iv){
    unsigned char key[SIZE16];
    RAND_bytes(key, 16);
    return EVP_CipherInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv, 1); 
}

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

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