2017-01-06 3 views
2

AES/CBCを行うときに暗号化するたびに、ランダムにIV値を生成します。IV値をハッシュすると安全な改善はありますか?

private static IvParameterSpec getRandomIvParameterSpec() { 
    byte[] iv = new byte[16]; 
    new SecureRandom().nextBytes(iv); 
    return new IvParameterSpec(iv); 
} 

私は暗号化するたびにIV値を暗号化バイトに連結します。

暗号化バイトに連結する前にIV値(SHA-256)をハッシュすると、安全な改善はありますか?

+4

**あなたのアプリケーションのセキュリティを向上させることはできません。 – Makoto

答えて

3

SHA-256は、注射剤です。同じ入力を与えると、同じ出力が得られます。しかし、の形容詞ではありません。 メートル時間からメートル 両方のハッシュ、あなたがいることを知っている場合でも、そのメートル = メートル を締結することができない場合| m | = | m | (両方のメッセージの長さが同じです)。

したがって、SHA-256(または任意の決定論的関数)を適用しても、データのエントロピーを増やすことはできません。せいぜい、それはそれを減らさないでしょう。つまり、データが16の純粋にランダムなバイトの場合、ハッシュした後は「純粋にランダム」以上になりません。あなたのデータが純粋にランダムではなく、それをハッシュしてもランダムにすることはできません。まず、より良いエントロピーソースを使用する必要があります。

あなたが言及していないもう一つの問題は、あなたが現在16のランダムバイトを持っていることですが、SHA-256ハッシュ関数に入れれば、32バイトが得られます。どちらを使いますか?あなたが入力が完全にランダムでハッシュ関数が完璧だったとしても、注入性のために毎秒2バイトしか使用しないと、可能なすべてのビットパターンを得ることはできません。 (そうした場合、これはピジンホールの原理によって、バイトの残りの半分が常にあなたが選択したバイトの関数になることを意味します。SHA-256は当然ではありません。そのような特性を持つでしょう。)あなたが賢明で、バイトをいくつかの "スマート"な方法で結合しようとするならば、事態をさらに悪化させる可能性があります。

したがって、短い答えは「しないでください」です。利用可能な最も強力な非決定論的エントロピーソースを使用して必要なだけ多くのランダムバイトを生成し、それらを直接使用します。

+0

私に素晴らしい答え!どうもありがとう! – hanjoonk

関連する問題