5

ここでは問題にならないさまざまな理由により、テキストのチャンクを PostgreSQL に暗号化または base64 エンコード形式で保存しています。ただし、PostgreSQL の全文検索を使用して、暗号化されていない/デコードされた形式で検索クエリに一致するデータを見つけて返すことができるようにしたいと考えています。

これを達成するにはどうすればよいでしょうか?データベースにデータを送信する前に tsvector 値を作成する機能について言及している投稿を見たことがありますが、Postgres 側で利用できるものがあることを期待していました (少なくとも base64 テキストの場合)。

4

1 に答える 1

6

暗号化された値

暗号化された値についてはできません。クライアント側を作成したとしてもtsvector、tsvector には暗号化されたテキストの形式が含まれるため、ほとんどのアプリケーションでは受け入れられません。観察:

regress=> SELECT to_tsvector('my secret password is CandyStrip3r');
               to_tsvector                
------------------------------------------
 'candystrip3r':5 'password':3 'secret':2
(1 row)

... おっと。を使用する代わりにクライアント側でその値を作成しても問題ありませんto_tsvector。パスワードはクリアテキストのままです。tsvector を暗号化することはできましたが、全文検索には使用できませんでした。

確かに、暗号化された値を考えると:

CREATE EXTENSION pgcrypto;

regress=> SELECT encrypt( convert_to('my s3kritPassw1rd','utf-8'), '\xdeadbeef', 'aes');
                              encrypt                               
--------------------------------------------------------------------
 \x10441717bfc843677d2b76ac357a55ac5566ffe737105332552f98c2338480ff
(1 row)

あなたは次のようなことをすることができます(しかしすべきではありません):

regress=> SELECT to_tsvector( convert_from(decrypt('\x10441717bfc843677d2b76ac357a55ac5566ffe737105332552f98c2338480ff', '\xdeadbeef', 'aes'), 'utf-8') );
    to_tsvector     
--------------------
 's3kritpassw1rd':2
(1 row)

...しかし、コード表示ボックスを右にスクロールしても問題がすぐに明らかにならない場合は、他の誰かにセキュリティ設計を依頼する必要があります;-)

2 つの暗号化された数値を加算して同じキーで暗号化された結果を生成するなど、暗号化された値を復号化せずに操作を実行する方法については、多くの研究が行われているため、追加を行うプロセスで入力を復号化する機能は必要ありません。出力を得るために。これのいくつかは fts に適用できる可能性があります - しかし、それはこの分野での私の専門知識のレベルをはるかに超えており、恐ろしく非効率的であり、暗号的に弱い可能性があります.

Base64 でエンコードされた値

base64 の場合decodeは、base64 を にフィードする前に取得しますto_tsvectordecodeを返し、エンコードされたデータがテキストであることを知っているため、データベースのエンコードにデコードするために使用する必要byteaがあります。convert_frombyteatext

regress=> SELECT encode(convert_to('some text to search','utf-8'), 'base64');
            encode            
------------------------------
 c29tZSB0ZXh0IHRvIHNlYXJjaA==
(1 row)

regress=> SELECT to_tsvector(convert_from( decode('c29tZSB0ZXh0IHRvIHNlYXJjaA==', 'base64'), getdatabaseencoding() ));
     to_tsvector     
---------------------
 'search':4 'text':2
(1 row)

この場合、データベース エンコーディングを への入力として使用しましたconvert_fromが、基になるエンコードされたテキストが含まれていたエンコーディングを使用していることを確認する必要がありますbase64。アプリケーションは、これを正しく取得する責任があります。エンコーディングを 2 列目に保存するか、アプリケーションがエンコーディングを適用する前と同じように常にテキストをエンコードするようにすることをお勧めします。utf-8base64

于 2013-03-14T23:29:55.987 に答える