Predictable cipher key

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

Описание

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

Риск

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

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

Фиксация

Используйте сильный генератор псевдослучайного числа (PRNG) в ключе. Например:

  • Используйте OS-level PRNG, такой как /dev/random на UNIX® или CryptGenRandom() на Windows®

  • Используйте уровень приложения PRNG, такой как Усовершенствованный стандарт шифрования (AES) в режиме Counter (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
Удар: носитель
ID CWE: 310, 326, 330, 338

Введенный в R2017a