0.はじめに

こんにちは。
キャスレーコンサルティング、SD(システム・デザイン)部の大原です。

私が過去に担当したプロジェクトで、セキュリティ面を考慮して、「登録するデータを暗号化してDBに保存したい」というご要望がございました。
そのプロジェクトで使用するDBがPostgreSQLだったため、PostgreSQLの拡張モジュールを使用する事で、
「登録するデータを暗号化してDBに保存したい」というご要望に応える事ができました。

そこで本ブログでは、PostgreSQLの拡張モジュールを使用して、データの暗号化(復号化)を行い、
DBに保存する方法を、簡単ではございますが、ご紹介させて頂きたいと思います。

1.実行環境と初期状態

1-1 実行環境

OS:windows10
PostgreSQL:9.6

1-2 インストール済み拡張一覧

DB自体作ったばかりなので、拡張モジュールは特に使えません。

postgreSQL1

2.暗号化拡張モジュールアクティベート

2-1 アクティベートと確認

対象のDBにログインして、拡張モジュールをアクティベートします。
この作業はDBごとに適用されます。また管理者権限が必要です。

postgreSQL2

2-2 暗号化関数動作確認

postgreSQLの拡張モジュールは、共通鍵/公開鍵どちらも対応しています。

・共通鍵で暗号化するイメージ

共通鍵

・公開鍵で暗号化するイメージ

公開鍵

今回は、共通鍵にします。

postgreSQL3

暗号化アルゴリズムの指定もできますが、ここでは省略します。デフォルトはAES128だそうです。
アルゴリズムで迷ったら、CRYPTREC暗号リストを参考にしておけば、とりあえず問題ないのではと思います。

3.テーブル作成 ⇒ データ格納 ⇒ データ確認

postgreSQL4

①暗号化したデータを格納するテーブルを用意します。
pgp_sym_encryptの返り値は、バイト配列なのでデータ型はbyteaです。
create table table1(id serial, val bytea);

②暗号化しながらテーブルにデータを挿入します。
insert into table1 (val) values (pgp_sym_encrypt(‘キャスレー’, ‘pass’));

③挿入されたデータを確認します。
select * from table1;

4.復号データ取得

postgreSQL5
①格納した暗号文を復号しながら取り出します。
select id, pgp_sym_decrypt(val, ‘pass’) from table1;

②当然、パスワードを違えれば取り出せません。
select id, pgp_sym_decrypt(val, ‘password‘) from table1;

③復号しながら検索条件としても使えます。
オーバーヘッドはかかりますが、GroupBy, OrderByの条件としても使えます。
select id, pgp_sym_decrypt(val, ‘pass’) from table1 where pgp_sym_decrypt(val, ‘pass’) = ‘コンサルティング’;

5.さいごに

・鍵の扱いについて
・パフォーマンスについて 等
業務で使用する場合には他にも色々考える必要があるかとは思いますが、
よりセキュアなシステムのためには、このようなモジュールを使うことも一つの手段かと思います。

最後まで、お読みいただきありがとうございます。