postgreSQLの暗号化関数

postgreSQLをインストールしたついでにこれまでMySQLで運用していた社内システムの一部をpostgreSQLに置き換えて試してみました。アプリケーション内部では平易なクエリしか使用していませんでしたので、引っかかったのはパスワードなど一部フィールドの暗号化/複合化の部分(aes_encrypt/aes_decryptの関数)だけでした。せっかくなのでこの部分に手を入れてみました。ところで、postgreSQLの暗号化オプションに関して、8.0.1のドキュメントにはその記述が見当たらず戸惑いましたが8.0.3のドキュメントから16.7. 暗号化オプションとして記載されるようになったようです。

まず、最初に暗号化のための外部ライブラリを生成します。ライブラリ内部で使用されるrandom()にはlibcが使用されるようです。openSSLのLibraryなどを使用する場合、makefileを修正します。(今回はそこまでやりませんでした)

cd ${POSTGRESQL_SORUCE}/contrib/pgcrypto
make
make install

これでencrypt/decrypt/crypt/digestなどの暗号化関数が使用できるようになりますが肝心の関数はユーザ定義の関数として提供されているためこれらを作成する必要があります。

psql -d database_name -f ${POSTGRESQL_SORUCE}/contrib/pgcrypto/pgcrypto.sql
create table test (name char(128),passwd bytea );
insert into test (name,passwd) values \
  ('myname',encrypt('my_password','salt','aes'));
select name from test where \
  decrypt(passwd,'salt','aes') = 'my_password';

こんな感じで扱えます。アルゴリズムとしてはBlowfishなども使用できるようです。暗号化関数をユーザ定義として提供するのは悪くはない手だとは思うのですがやっぱり標準で何かしらの手段を用意してくれたほうが楽かなーと思いましたが、

There are no plans to explicitly support encrypted data inside of Postgres (though there is nothing to prevent users from encrypting data within user-defined functions). There are no plans to explicitly support encrypted network connections, either, pending a total rewrite of the frontend/backend protocol.

とありますから、今後もこの方式なのでしょう。こういったポリシーは尊重すべきですね。

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/100

Comments