Missing salt for hashing operation

Хэшированные данные уязвимы для атаки радужной таблицы

Описание

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

  • EVP_DigestFinal

  • EVP_DigestSignUpdate

  • EVP_DigestVerifyUpdate

  • SHA*_Final семейство функций

Отсутствующая соль для операции хеширования не вызывает дефекта, если нет доступной информации о контексте. Например, если контекст передается как аргумент функции, которая вызывает операцию хеширования, или если контекст объявлен вне возможностей функции. Для примера в этом фрагменте кода дефект не возникает.

EVP_MD_CTX ctx_global;

void foo(EVP_MD_CTX* ctx) {
//ctx passed as argument of func()
    EVP_DigestFinal(ctx, out_buf, &out_len); //no defect
}

void bar() {
// ctx_global declared outside of bar() 
    EVP_DigestFinal(&ctx_glob, out_buf, &out_len); //no defect
}

Риск

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

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

Предоставляйте соль, когда вы хешируете данные.

Примеры

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

#include <openssl/evp.h>
#include <cstring>

unsigned char* out_buf;
unsigned int out_len;

void func()
{
    const char* src = "toto";
    EVP_MD_CTX ctx;

    EVP_DigestInit(&ctx, EVP_sha256());
    EVP_DigestUpdate(&ctx, src, strlen(src));
    EVP_DigestFinal(&ctx, out_buf, &out_len);
    EVP_cleanup();
}

В этом примере контекстные ctx инициализируется с помощью SHA-256 алгоритма безопасного хеширования, затем EVP_DigestUpdate хэши src в ctx. Потому что EVP_DigestUpdate вызывается только один раз, никакая соль не может быть обеспечена для повышения безопасности операции хеширования. Значение дайджеста, которое EVP_DigestFinal retrieves тогда уязвим к предварительно вычисленным радужным атакам.

Коррекция - Hash Salt в контекст после начального хэша данных

Одной из возможных коррекций является хеширование соли в контекст ctx после первой операции хеширования. Получившееся значение дайджеста, которое EVP_DigestFinal получение более безопасно.

#include <openssl/evp.h>
#include <openssl/rand.h>
#include <cstring>

#define BUFF_SIZE_32 32

unsigned char* out_buf;
unsigned int out_len;

void func()
{
    const char* src = "toto";
    const char* salt;

    RAND_bytes((unsigned char*)salt, BUFF_SIZE_32);
    EVP_MD_CTX ctx;

    EVP_DigestInit(&ctx, EVP_sha256());
    EVP_DigestUpdate(&ctx, src, strlen(src));
    EVP_DigestUpdate(&ctx, salt, BUFF_SIZE_32);
    EVP_DigestFinal(&ctx, out_buf, &out_len);
    EVP_cleanup();
}

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

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