Oracleで暗号化パッケージを利用する
Oracle(10g以降)のDBMS_CRYPTO.ENCRYPT/DBMS_CRYPTO.DECRYPTを使用してデータの暗号化・復号化を実現できる。
事前準備
DBMS_CRYPTOを利用するには、実行権限が必要となる為、SYSユーザーでログインして権限を付与する。
1 | GRANT EXECUTE ON DBMS_CRYPTO TO user_name; |
暗号化
以下のサンプルでは、文字列を暗号化した結果をbase64でエンコードしてVARCHAR2に変換した値を返している。
1 2 3 4 5 6 7 8 9 10 11 12 | 暗号化SQL SELECT UTL_RAW.CAST_TO_VARCHAR2( --VARCHAR2に変換 UTL_ENCODE.BASE64_ENCODE( --base64でエンコード DBMS_CRYPTO.ENCRYPT( --暗号化 UTL_I18N.STRING_TO_RAW ('1', 'AL32UTF8'), --ROWデータに変換 8 + 256 + 4096, --暗号化方式+暗号ブロック連鎖+データ補完(AES256/CBC/PKCS5) UTL_I18N.STRING_TO_RAW(RPAD('mypassword', 32, CHR(0)), 'AL32UTF8') --パスワード(ROWデータに変換) ) ) ) AS encryption FROM dual; |
実行結果
1 2 3 | ENCRYPTION -------------------------- 00705BMd3YpkaeZxCq4nlg== |
復号化
以下のサンプルでは、base64でエンコードされた暗号化文字列を復号化してVARCHAR2に変換した値を返している。
1 2 3 4 5 6 7 8 9 10 11 12 | SELECT UTL_I18N.RAW_TO_CHAR( --VARCHAR2に変換 DBMS_CRYPTO.DECRYPT( --復号化 UTL_ENCODE.BASE64_DECODE( --base64でデコード UTL_RAW.CAST_TO_RAW('00705BMd3YpkaeZxCq4nlg==') --ROWデータに変換 ), 8 + 256 + 4096, --暗号化方式+暗号ブロック連鎖+データ補完(AES256/CBC/PKCS5) UTL_I18N.STRING_TO_RAW(RPAD('mypassword', 32, CHR(0)), 'AL32UTF8') --パスワード(ROWデータに変換) ) , 'AL32UTF8' ) AS decryption FROM dual; |
実行結果
1 2 3 | DECRYPTION -------------------------- 1 |
暗号化/復号化のストアドファンクション
ストアドファンクションの作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | -- 暗号化ファンクション CREATE OR REPLACE FUNCTION AES256_ENCRYPT( P_TEXT VARCHAR2, --暗号化対象文字列 P_PASSWORD VARCHAR2 --パスワード ) RETURN VARCHAR2 IS vEncrypted RAW(2000); BEGIN --暗号化 vEncrypted := DBMS_CRYPTO.ENCRYPT( --暗号化対象文字列(ROWデータに変換) src => UTL_I18N.STRING_TO_RAW (P_TEXT, 'AL32UTF8'), --暗号化方式+暗号ブロック連鎖+データ補完(AES256/CBC/PKCS5) typ => DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5, --パスワード(ROWデータに変換) key => UTL_I18N.STRING_TO_RAW(RPAD(P_PASSWORD, 32, CHR(0)), 'AL32UTF8')); --暗号化した値をbase64でエンコードしてVARCHAR2に変換して復帰 RETURN UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(vEncrypted)); END; / -- 復号化ファンクション CREATE OR REPLACE FUNCTION AES256_DECRYPT( P_ENCRYPTED VARCHAR2, --復号化対象文字列 P_PASSWORD VARCHAR2 --パスワード ) RETURN VARCHAR2 IS vRaw RAW(2000); BEGIN --暗号化文字列をbase64でデコード vRaw := UTL_ENCODE.BASE64_DECODE(UTL_RAW.CAST_TO_RAW(P_ENCRYPTED)); --復号化 vRaw := DBMS_CRYPTO.DECRYPT( --復号化対象 src => vRaw, --暗号化方式+暗号ブロック連鎖+データ補完(AES256/CBC/PKCS5) typ => DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5, --パスワード key => UTL_I18N.STRING_TO_RAW(RPAD(P_PASSWORD, 32, CHR(0)), 'AL32UTF8')); --復号化した値をVARCHAR2に変換して復帰 RETURN UTL_I18N.RAW_TO_CHAR (vRaw, 'AL32UTF8'); END; / |
ストアドファンクションの実行結果
1 2 3 4 5 6 7 8 9 10 11 | SQL> SELECT AES256_ENCRYPT('1', 'mypassword') FROM dual; AES256_ENCRYPT('1','MYPASSWORD') -------------------------------------------------------------------------------- 00705BMd3YpkaeZxCq4nlg== SQL> SELECT AES256_DECRYPT('00705BMd3YpkaeZxCq4nlg==', 'mypassword') FROM dual; AES256_DECRYPT('00705BMD3YPKAEZXCQ4NLG==','MYPASSWORD') -------------------------------------------------------------------------------- 1 |