暗号化された値
暗号化された値についてはできません。クライアント側を作成したとしても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_tsvector
。decode
を返し、エンコードされたデータがテキストであることを知っているため、データベースのエンコードにデコードするために使用する必要bytea
があります。convert_from
bytea
text
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-8
base64