[pgsql-jp: 37405] Re: データベースの暗号化について

Reiji Matsumoto matsumoto @ spline.oc.to
2006年 8月 9日 (水) 15:31:35 JST


松本と申します。

>パスワードもわりとセットで持って行かれませんか?
>とか言われてしまえばそれまでなんですけど。

思い付きで書きますけど、いっそサーバーにパスワードを送信しないで
クライアント側でのみ、エンコード、デコードするのは如何でしょう?
データ更新時や検索時も常にエンコード済のデータで送受信し、ネット上
にパスワードや平文を流さない仕様です。テーブル内にはエンコード
済のデータを設置しますが、サーバーサイドで一切デコードを行いません。

WEBアプリケーションならjavascriptでエンコードするとか、そんな
イメージですね。例えば、

function enc(encpass, data)
{
  if(data == '鈴木') return (encpass + 1) + '####';
  if(data == '佐藤') return (encpass + 1) + '****';
  if(data == '田中') return (encpass + 1) + '&&&&';
  if(data == '一郎') return (encpass + 1) + '!!!!';
  if(data == '二郎') return (encpass + 1) + '$$$$';
  if(data == '三郎') return (encpass + 1) + '((((';
  return '';
}

function dec(decpass ,data)
{
  if(data == (decpass + 1) + '####') return '鈴木';
  if(data == (decpass + 1) + '****') return '佐藤';
  if(data == (decpass + 1) + '&&&&') return '田中';
  if(data == (decpass + 1) + '!!!!') return '一郎';
  if(data == (decpass + 1) + '$$$$') return '二郎';
  if(data == (decpass + 1) + '((((') return '三郎';
  return '';
}

デコード、エンコード用の関数が上記の通りだとします(もちろん、実際には
実用的な暗号を利用します)。こんな関数をクライアント側に用意しておきます。
この暗号化ロジックに基づき、予めサーバー側のテーブルは以下のような感
じにしておきます。正しいパスワードは"1234"だとします。

id | sei        |mei
---+------------+-------- 
 1 |1235****    |1235((((    デコードすると佐藤三郎
 2 |1235####    |1235$$$$    デコードすると鈴木二郎
 3 |1235&&&&    |1235!!!!  デコードすると田中一郎


クライアント側の検索フォームに「鈴木」と入力したら、
enc(1234,'鈴木')で'1235####'に変換してからサーバーに送信しま
す。サーバー側では、

SELECT sei,mei FROM member WHERE name = '1235####';

を実行。カラム内は同じロジックですでに暗号化されているので

  sei    |   mei
---------+---------
1235#### | 1235$$$$

が返ります。これをデコードせずにそのままクライアントに返してやり
ます。クライアントでは表示前にdec()関数を実行します。上記の例
だと、

dec(1234, '1235####') -> '鈴木'
dec(1234, '1235$$$$') -> '二郎'

となり、「鈴木」を検索する事で「鈴木二郎」が取得できます。
ただし部分一致検索等を出来るようにするのは、暗号強度を考えると
難しそうですね。また完全一致のみのサポートで理論的には強度な
暗号を利用したとしても、もしseiカラムで一番多いのが'1235####'
だと分かってしまうと'1235####'='鈴木'である事が統計的に推測
できてしまうかも知れません。かと言って検索の事を考えると1対多の
暗号が利用できませんね。

諸々問題がありますが、うまく機能すればサーバー内と回線上に平文
を保存したり、中間生成したりする必要がない実装になると思います。
アイディアレベルのお話しではありますが、如何でしょうか。





pgsql-jp メーリングリストの案内