2012-01-14 12 views
2

私は、pkg_cryptoを使用してユーザーの個人情報を保護するプロジェクトを進めています。数千行(おそらく数万になると予想されます)があり、クエリにWHEREまたはORDER BY句を使用するたびに、結果が返される前にテーブル全体が復号化されます。これは、単一のクエリでは数秒かかるため、開発には使用できますが、リリースにはあまり適していない可能性があります。pkg_cryptoで暗号化された列の索引付け

セキュリティを損なうことなく暗号化された列で動作するインデックスを作成する方法はありますか?

挿入と選択は(iBatisので)このような何かを見て:

挿入:

INSERT INTO "USER_TABLE" 
(
"ID" 
,"LOGIN" 
,"PASSWORD" 
,"NAME" 
,"EMAIL" 
) 
VALUES 
(
user_table_seq.nextval, 
#login# 
,#password# 
,pkg_crypto.encrypt(#name#, 'key') 
,pkg_crypto.encrypt(#email#, 'key') 
) 

を選択:私は先制そこに入れます

SELECT 
"ID" 
,"LOGIN" 
,"PASSWORD" 
,pkg_crypto.decrypt("NAME", 'key') NAME 
,pkg_crypto.decrypt("EMAIL", 'key') EMAIL 
FROM "USER_TABLE" 
WHERE pkg_crypto.decrypt("NAME", 'key') LIKE #name# || '%' 
AND pkg_crypto.decrypt("EMAIL", 'key') LIKE '%' || #email# 

そのパスワードはdbに渡される前にサーブレットによってハッシュされます。

答えて

3

実質的に、答えはませではありません。

とき各値は暗号化されており、ランダムなIV(initializアトニオンベクトル)を選択します。そして、これはインデックスに何が入っているのか予測できないことを意味します。同じキーであっても値を再暗号化すると、別の結果が得られます。したがって、検索している値に対して暗号化を再現できないため、暗号化された値に意味のあるインデックスを使用することはできません。いずれの場合でも、索引は等価検索にのみ役立ちます。データはランダムな順序で格納されます。

ハッシュ値が格納されている方が良い場合があります(暗号化された値も同様です)。既知のアルゴリズムで名前をハッシュすると、必要に応じてハッシュ値を再現し、一致する行を見つけることができます。しかし、単純にハッシュを知ることで、あらかじめ計算された「虹の表」を除いて、ハッシュされた値を決定することはできません(侵入者)。

暗号化された列を意味のある方法で索引付けすることはできません。一意性であっても(同じ値がランダムIVによって異なる方法で暗号化されるため)意味のある索引付けはできません。

4

あなたは、私が想定していた、(データを暗号化するためにPKG_CRYPTOを使用する必要はありますがDBMS_CRYPTOまたはDBMS_OBFUSCATION_TOOLKITのいずれかを呼び出して、あなたが書いたものですこれは、余分なコストのオプションですが?Oracleが)(transparent data encryption (TDE)と呼ばれる機能を持っているだろうあなたは、Oracleは透過的に、ディスク上のデータを暗号化し、それをディスクから読み取るだときにそれを解読して、あなたのデータのLIKE述語のこの種を使用していすることができます。

+0

私はそれが一般的に使用されるライブラリであると仮定しました。それは私が与えられたプロトタイプに含まれていました。 – bdares

+0

また、この仕様では、攻撃者がdbに対してクエリを実行できる場合でも、情報を保護する暗号化方式が必要と考えています。 – bdares

関連する問題