3

私は PostgreSQL 8.4 を使用してpgp_sym_encryptおり、pgcrypto 拡張機能の関数を使用して、挿入時にデータを暗号化しています。したがって、挿入クエリは次のようになります。

insert into myTable (
                     column1
                    ,column2
                     ) 
values (
        pgp_sym_encrypt('value1','key')
       ,pgp_sym_encrypt('value1','key')
       );

テーブルの列 1 に主キー制約を適用しましたが、暗号化されたデータが同じ復号化された値に対して常に同じであるとは限らないため、制約は既存の値の挿入を常に検出するとは限りません。

質問 :

この制約を適用して、復号化されたデータが一致するかどうかをチェックし、その場合は挿入を許可しないようにするにはどうすればよいですか?

4

1 に答える 1

4

一意性を強制したい場合は、情報をハッシュし、そのハッシュを一意のインデックスを持つ別の列に保存することをお勧めします。ただし、必要なスペースが小さいため、ダイジェストを使用して長いテキストの一意性を確認することがよくありますが、ハッシュの不可逆的な性質により、残りは発見できないはずです。まず、列が必要です。

alter table myTable add column column3 bytea unique;

次に、挿入のために3番目の列を含めます

insert into myTable(
column1
,column2
,column3
)
values (
pgp_sym_encrypt('value1','key')
,pgp_sym_encrypt('value1','key')
,digest('value1', 'sha256')
)

sha256 は、その形式で保存されたものはすべて解読されず、バイナリ列では 32 バイトとインデックスのみが必要になるように、データを簡単に改ざんする必要があります。レコードの場合、さまざまなハッシュのデータ長は次のとおりです。

select length(digest('your message goes here', 'sha1'));
-- 20
select length(digest('your message goes here', 'sha256'));
-- 32
select length(digest('your message goes here', 'sha512'));
-- 64

最後に、'value1' を 'key' で 2 回暗号化していますか、それとも 2 つの別々の情報ですか? 私は、それらが 2 つの異なるデータ列であると推測します。その場合、両方で一意性が必要な場合は、もちろん、さらに列を作成してそれもハッシュする必要があります。

于 2015-01-17T12:21:00.893 に答える