ハッシュ演算のソルトがありません
ハッシュされたデータはレインボー テーブル攻撃に対して脆弱
説明
この欠陥は、以下の関数においてダイジェスト コンテキストを使用するときに、データをコンテキストに 1 回しかハッシュしなかった場合または後続のすべてのハッシュ演算で null ソルトを使用した場合に発生します。ソルトとは、ハッシュ演算のセキュリティ向上のために使用するランダム データです。ハッシュ演算では、より安全なハッシュ値を生成するための入力としてソルトを利用します。
EVP_DigestFinalEVP_DigestSignUpdateEVP_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
}
リスク
ソルトを使用せずに同じデータをハッシュすると、得られるハッシュ値も同一になります。たとえば、ユーザー パスワードをハッシュし、2 人のユーザーが同じパスワードをもつ場合、ハッシュされたパスワードも同一になります。そのようなハッシュ化は、事前計算によるレインボー攻撃に対して脆弱となります。
修正方法
データをハッシュする際にソルトを付与します。
例
結果情報
| グループ: 暗号化 |
| 言語: C | C++ |
| 既定値: オフ |
コマンド ライン構文: CRYPTO_MD_NO_SALT |
| 影響度: Medium |
バージョン履歴
R2019b で導入