web-dev-qa-db-ja.com

データベースの行暗号化されたデータに対してクエリを実行できますか?

私の仮定のいずれかが間違っている場合はお知らせください。

たとえば、データベース列のすべての行が、パスワードベースのキー導出を使用する単一のパスフレーズ "SECRET"を使用してアプリケーションレベルで暗号化されているデータベースがあるとします。

My Database

ランダムソルトとIVはどちらも、2つの異なる行の同じデータを暗号化すると、異なる暗号化値が生成されることを保証します。ただし、攻撃者が私のデータベースへの読み取りアクセス権を持ち、1つの行の暗号化をブルートフォースで実行できる場合、攻撃者は私の「秘密」パスフレーズを知っており、暗号化されたすべての行を復号化できます。

これは、各行にランダムソルトとIVを使用する主な利点は、暗号化されたデータの値の頻度を隠すことであることを意味しますか?たとえば、ランダムなソルトとIVを使用しないことの欠点は、攻撃者が私のデータベースを見て「50行に値Xがあり、49行に値Yがあり、1行に値Zがある」ことを確認できても、何がわからないかです。 X、Y、およびZは、暗号化も解読できない限り、実際にはそうですか行ごとにランダムなsalt/IVを使用する理由は他にもありますか?

暗号化された値をデータベースに照会する必要があるとしましょう。ランダムソルトとIVを使用すると、「値Nの行を取得する」というクエリが不可能になりますか?暗号化を使用してデータを保護し、それに対してクエリを実行するにはどうすればよいですか?また、どのような種類の一般的な脅威に対して脆弱ですか?

3
Steven

まず第一に、それはあなたが保護している周波数だけではありません。例で攻撃者が値Xをクラックした場合、攻撃者は50行すべてを知っています。行がユーザーであり、暗号化された値がパスワードであるとしましょう。攻撃者は50人のユーザーすべてを一度にポップしました。これは、50のエントリが同じであることを知っているよりも価値があります。

行ごとにランダムなソルトとIVを使用してもクエリ自体が不可能になるわけではありませんが、他の多くの旋回を行わなければ、クエリは本当に難しくなります。暗号化されたデータを検索するいくつかの方法を提供する「準同型暗号化」という用語を調べます。実際には、これは実際にはスケーラブルではなく、運用環境でも行われませんが、不可能ではありません。

https://en.wikipedia.org/wiki/Homomorphic_encryption

機能性を犠牲にする「どれほどのセキュリティ」は、あなただけが答えることができる質問です。あなたの脅威モデルは何ですか?保護されているデータの価値は何ですか?セキュリティは、それ自体の目的ではなく、ビジネス目標に役立つ必要があります。それはそれがもたらす価値よりも低くなければならないコストを持っています。攻撃者が検索機能を制御できるようになった場合、攻撃者はあらゆる方法ですべてのデータを入手します。

実際には、データがメモリに収まる場合は、データを復号化し、プレーンテキストを介してメモリ内を検索し、データをディスクに暗号化したままにするのが最善の策です。できない場合は、格納されたデータを検索可能なサイズのサブチャンクに分割することにより、情報の一部を漏らさなければならない場合があります。

保護された情報がパスワードやクレジットカード番号のようなものである場合、同じプレーンテキストの暗号化を別の暗号テキストにマスキングする性質をあきらめたくないでしょう。攻撃者が転送暗号化を実行できるものはすべて、既知のプレーンテキスト攻撃に使用できます。

例:Baddie(シークレットではなく、データベースへの読み取りアクセス権あり)が正当なユーザーとしてサービスにサインアップし、パスワードとして「password」を提供します。次に、データベースをポップして自分のレコードを見つけ、「パスワード」を選択したすべてのotherユーザーを認識します。ひどい。

2
JesseM

はい、IV /塩を使用する主な目的は、暗号化/ハッシュ関数への同じ入力が同じ出力を生成しないようにすることです。ランダムIV /塩を使用しない場合、同じ暗号化/ハッシュ値がデータベースに同じように表示されます。

暗号化されたデータのクエリは不可能ではなく、非常に遅くなります。 where、join、order by句で暗号化フィールドを使用する必要がある場合は、関数を使用してIV /塩を読み取り、行ごとに値を復号化する必要があります。

1
Dan Landberg