13

対称キーを使用して SQL 列レベルの暗号化を適用しようとしています。データベース マスター キー、証明書、および対称キーを作成するために必要な最初の手順は単純明快であり、対称キーを使用したデータの暗号化/復号化を正常にテストしました。

ただし、データが暗号化されると、クエリを実行する最善の方法がわかりません。例えば

SELECT PlainTextA, PlainTextB, PlainTextC 
WHERE CONVERT(varchar, DECRYPTBYKEY(EncyptedColumn)) = @SearchTerm

確かに完全なテーブルスキャンになりますか?

私がうまくいくかもしれないと思った別のオプションは、最初に検索条件を暗号化することです。

SELECT PlainTextA, PlainTextB, PlainTextC 
WHERE EncyptedColumn = ENCRYPTBYKEY(KEY_GUID('KeyName'), @SearchTerm)

ただし、生成される暗号化された値は常に異なるため、これは機能しません。

どんな提案でも大歓迎です。

4

3 に答える 3

15

一般的な方法は、暗号化された値値の一方向ハッシュの両方を格納することです。特定の値を探すときは、ハッシュを探します。このようにして、関心のある値を見つけるためにすべての行を復号化する必要なしに、効率的にクエリを実行できます。

create table Table (
EncryptedColumn varbinary(max),
HashValue binary(20),
PlainA int,
PlainB varchar(256),
PlainC Datetime);

create index ndxTableHash on Table(HashValue);

select PlainA, plainB, PlainC
from table
where HashValue = HashBytes('SHA1', @searchTerm);

理論的には、ブルームーンで一度ハッシュ競合が発生する可能性があります。パラノイドセーフにするために、復号化された列にダブルチェックを追加します。

select PlainA, plainB, PlainC
from table
where HashValue = HashBytes('SHA1', @searchTerm)
and DecryptByKey(..., EncryptedColumn) = @searchTerm;

暗号化されたデータのインデックス作成およびSQLServer2005 :暗号化されたデータの検索も参照してください。

于 2010-08-24T21:10:59.797 に答える
3

WITH SCHEMABINDING選択肢の 1 つは、検索値の一方向 HASH を使用して、テーブルに新しい列を追加する (または計算列を含むビューを作成し、それにインデックスを付ける) ことです。強力なハッシュである必要はありません。CHECKSUM のような単純なものが機能します。次に、ルックアップで検索値をハッシュし、インデックス付けされたハッシュでフィルター処理します。そうすれば、実際に値自体を公開することなく、検索可能でインデックス可能なものを公開できます。

ただし、これを直接行う別の方法がある場合は、それが何であるかを知りたいです:)

于 2010-08-24T20:38:54.250 に答える
-3

別のオプションは、復号化された値の列を含むビューを使用し、それに従ってレコードを見つけることです。

SELECT PlainTextA, PlainTextB, PlainTextC from TheView 
WHERE DecryptedColumn = @SearchTerm
于 2015-07-13T11:24:37.137 に答える