[Oracle] DBMS_OBFUSCATION_TOOLKITを使ったデータの暗号化方法 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

Oracleでデータの暗号化を行うには、DBMS_OBFUSCATION_TOOLKITパッケージを使用します。


DBMS_OBFUSCATION_TOOLKITパッケージでは、データ暗号化規格(DES)またはトリプルDES(3DES)アルゴリズムを使ったデータの暗号化と復号化を行うことができます。

DESアルゴリズムで暗号化を行う場合、DESENCRYPTプロシージャを使用します。

DESアルゴリズムによる暗号化

DESENCRYPTプロシージャはVARCHAR2型用とRAW型用の2種類が定義されており、パラメータ名を省略して実行しようとするとPLS-00307エラーが発生します。


そのため、以下のようにパラメータ名を明示的に指定して実行しなければなりません。

DBMS_OBFUSCATION_TOOLKIT.DESENCRYPT( 
  input_string => wk_password, 
  key_string => wk_encrypt_key, 
  encrypted_string => wk_encrypted_password 
);


また、ここで指定する暗号キー(key_string)には64ビットの値を渡してやる必要があります。

暗号キーの長さが64ビットに満たない場合、ORA-28324エラーが発生します。


ただし、暗号キーの長さが64ビットを超える場合は、上位64ビットが使用されるためエラーにはなりません。

DESアルゴリズムによる復号化

DESアルゴリズムで暗号化されたデータの復号化を行う場合、DESDECRYPTプロシージャを使用します。

DESDECRYPTプロシージャもDESENCRYPTプロシージャと同様、VARCHAR2型用とRAW型用の2種類が定義されており、パラメータ名を省略して実行するとPLS-00307エラーが発生します。


そのため、以下のようにパラメータ名を明示的に指定して実行しなければなりません。

DBMS_OBFUSCATION_TOOLKIT.DESDECRYPT( 
  input_string => wk_password, 
  key_string => wk_encrypt_key, 
  decrypted_string => wk_decrypted_password 
);

また、ここで指定する暗号キー(key_string)には暗号化の際に使用したのと同じ値を渡してやる必要があります。
3DESアルゴリズムによる暗号化

3DESアルゴリズムで暗号化を行う場合、DES3ENCRYPTプロシージャを使用します。


Oracleの3DESアルゴリズムでは2キーまたは3キーの実装をサポートしており、そのどちらを使用するかをパラメータ(which)で指定する必要があります。


0の場合2キーモード、1の場合3キーモードを指定します。(デフォルトは0)

DBMS_OBFUSCATION_TOOLKIT.DES3ENCRYPT( 
  input_string => wk_password, 
  key_string => wk_encrypt_key, 
  encrypted_string => wk_encrypted_password, 
  which => 0
);

また、ここで指定する暗号キー(key_string)には2キーモードの場合128ビット、3キーモードの場合192ビットの値を渡してやる必要があります。

DESアルゴリズムによる復号化
3DESアルゴリズムで暗号化されたデータの復号化を行う場合、DES3DECRYPTプロシージャを使用します。

DBMS_OBFUSCATION_TOOLKIT.DES3DECRYPT( 
  input_string => wk_password, 
  key_string => wk_encrypt_key, 
  decrypted_string => wk_decrypted_password, 
  which => 0
);


ここで指定する暗号キー(key_string)とモード(which)には暗号化の際に使用したのと同じ値を渡してやる必要があります。


と、データの暗号化はこのようにして行うことができるのですが、これらの暗号化には必ず暗号キーが必要になります。


この暗号キーが簡単に特定できてしまうようだと、せっかく暗号化しても容易に破られる危険性があるため、これをどのように管理するかが重要になります。

また、暗号化のロジックを解読されないよう、暗号化を行うPL/SQLプログラムをラップユーティリティを使用して容易に解読できないコードに変換してしまうなどの対策も施しておいたほうがいいでしょう。

あと、この暗号化はサーバー側で行われるため、クライアント-サーバー間の通信を保護するには別途対策が必要になります。


※Oracle10gではDBMS_OBFUSCATION_TOOLKITパッケージに加えてDBMS_CRYPTOパッケージが追加されており、暗号化手法が追加されるなどの機能強化がなされています。