2007年6月20日水曜日

DBMS_OBFUSCATION_TOOLKIT(Oracle)でデータの暗号化

スズキです。

セキュリティにうるさい昨今、クレジットカード番号などは、
暗号化してDBに保存する必要が多々あります。

まあ、暗号化はJavaとかPHPでやればいいって話もありますが、
今回は、JavaとPHPの両方から、DB(Oralce)をつっつくので、
共通で使える、暗号/復号手段として、
Oracleの関数(DBMS_OBFUSCATION_TOOLKIT)を使ってみました。
(下記参考にした情報です)
ftp://ftp.ashisuto.co.jp/pub/standard/vol81/obfuscation_toolkit.pdf

結局は、上記の組み込みファンクション使って、下記のようなファンクション
を作成します。ただ、下記の場合だと、
8の倍数の文字数しか暗号化できないので、そのあたりを調整するために、
string_encryptのinput_valには"RPAD(input_val, 24, ' ')"を、
string_decryptのreturn_valには"RTRIM(return_val, ' ')"をかけています。

--------暗号化ファンクション
CREATE OR REPLACE FUNCTION string_encrypt(input_val VARCHAR2)
RETURN VARCHAR2 IS
  key_str VARCHAR2(16) := 'ABCDEFGHIJKLMNOP';
  return_val VARCHAR2(40) := NULL;
BEGIN
  DBMS_OBFUSCATION_TOOLKIT.DESEncrypt(
    input_string => RPAD(input_val, 24, ' '),
    key_string => key_str,
    encrypted_string => return_val
   );
  RETURN return_val;
END;
/
--------復号化ファンクション
CREATE OR REPLACE FUNCTION string_decrypt(input_val VARCHAR2)
RETURN VARCHAR2 IS
  key_str VARCHAR2(16) := 'ABCDEFGHIJKLMNOP';
  return_val VARCHAR2(40) := NULL;
BEGIN
  DBMS_OBFUSCATION_TOOLKIT.DESDecrypt(
    input_string => input_val,
    key_string => key_str,
    decrypted_string => return_val
  );
  RETURN RTRIM(return_val, ' ');
END;
/
--------

そして、こんな感じで確認できます。
--------
select
  string_decrypt(
    string_encrypt('1234567890')
  )
from dual
--------

PL/SQLも目覚めだしたね。

--
blog: http://suz-lab.blogspot.com/

0 コメント: