2016-05-06 25 views
0

私はVPSにあるDBと通信するアプリケーションを開発しています。 AES-256で暗号化された情報を私のDBに保存する必要があります。AES 256 IVなしの暗号化/復号化

私が正しい場合、暗号化すると、生成されるIVパラメータがあり、暗号化ごとに異なります。しかし、私が解読するとき、私はDBにキーと暗号化されたテキストしか持っていないので、私はこのパラメータを持っていません。

この問題を解決するにはどうすればよいですか?

+0

複数の暗号化操作で同じキーを使用していますか? –

+0

私はDBのすべてのデータを暗号化するのに同じキーを使用します – Giorgio

+0

IVは秘密の値ではありません。それぞれの暗号化された値と一緒にクリアに保存することができます –

答えて

2

初期化ベクトルはどこかに格納する必要があります。概念的には、CBCモードでは、IVは暗号文の "ゼロ"ブロックであるため、暗号文の接頭辞として格納する人もいます。しかし、ほとんどの低レベルの暗号化ライブラリではこれは期待できません。そのため、アプリケーションは通常、暗号化の後にこの接頭辞を追加して解読する前にそれを削除するラッパーを提供する必要があります。

理想的には、暗号化された値を、使用された暗号化アルゴリズム、必要なパラメータ、および使用されるキー(下記参照)を指定するメタデータとともに保存する必要があります。これには、CBCを使用するブロック暗号のIVが含まれます。標準的なフォーマットは、暗号メッセージ構文、つまりPKCS#7です。標準であるため、オープンソースライブラリがそのフォーマットを処理するためのいくつかのオプションが用意されている可能性があります。

このメタデータを含めることで、時間の経過とともにキーを回転させる、データを新しいアルゴリズムに移行するなどの操作を行うことができます。同じキーで同じ方法ですべての値を暗号化する必要はありません。

注:メタデータに使用されているキーが示されていると言うと、これはもちろんキー自体が含まれているわけではありません。事前共有キーの場合は、ビッグキーリングのどのキーがペイロードを復号化するかを示すラベルです。パスワードベースの暗号化には、暗黙のパスワードから適切な鍵を引き出す方法に関する情報があります。

1

IVを暗号文と連結することができます(その長さは既知で定数です)。または、それらを互いに隣にDBに格納することができます。 IVは秘密ではありません。ブロック暗号が暗号化毎に異なって初期化されるようにするだけで、1つのファイル解読を強要しても他のすべてを妥協することはありません。

+0

"1つのファイルの暗号解読を強要することは他のすべてを妥協しない"というのは明らかな理由から間違っています。ブルートフォースは鍵を取り出すことを意味します(これはうまく選択された鍵があれば、とにかくAESでは不可能です)。攻撃者がその鍵を知っていれば、他の暗号文も妥協するでしょう。 CBCモードでは、IVを繰り返すことで、(部分的に)同一の平文と(部分的に)同一の暗号文を区別することができます。例えば、 CTRモードでは、その影響ははるかに大きく、機密性を無効にするまでは大きくなります。 –

+0

IVは、チェーン暗号の「ゼロ」ブロックです。 IVは(1)ランダム、(2)予測不能、(3)秘密でないことが必要です。 http://stackoverflow.com/questions/5796954/secret-vs-non-secret-initialization-vector –

+0

それはすべて正しいです。 「ブルートを1つのファイルの復号化が他のすべてを妥協しないように」固有のIVが必要であるという事実は、正しくありません。 IVを再利用すると、簡単なXORでCTRモードを妥協することができますが、その攻撃はブルートフォースではありません。ブルートフォースは、ブロック暗号の順列の正しい鍵を見つけることです。攻撃者がキーを検出したとき、IVは何も保護しません。しかし、OK、あなたはIVと塩を混同していないようですので、そのコメントを削除します。 –

関連する問題