DBMS_CRYPTO > DBMS_CRYPTO 使用方法 〜鍵付きハッシュ〜

DBMS_CRYPTO 使用例 〜鍵付きハッシュ〜

普通のハッシュ関数

HMAC と MD5

HMAC とは keyed-Hashing for Message Authentication Code の略、MD5 は Message Digest algorithm 5 の略である。どちらも ハッシュを生成するための仕組みである。

HMAC は keyed-Hashing の通り、ハッシュ値を生成するときにユーザー指定の秘密鍵を入力パラメータにできる。そのためハッシュ化される前のメッセージの類推が一層困難である。
ハッシュアルゴリズムには MD5 および SHA-1 が利用できる。

DBMS_CRYPTO.MAC ファンクション

DBMS_CRYPTO.MAC は RAW 型、BLOB 型 または CLOB 型のメッセージを「指定した秘密鍵」と「指定したハッシュアルゴリズム」を使用してハッシュ値に変換することができる。
MD5 アルゴリズムは 128 ビット、SHA-1 では 160 ビットのハッシュ値を戻す。強度は SHA-1 を使用した方が優れており MD5 より SHA-1 の利用が薦められている。

MAC ファンクションを SHA-1(160 ビット)で使用例

実行するには権限が必要 ⇒ DBMS_CRYPTO 使用方法 〜準備〜

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2    vKey     VARCHAR2(2000);
  3    vHashed  RAW(20);
  4    vText    VARCHAR2(2000);
  5  BEGIN
  6    vText := 'ハッシュ化したい文字列';
  7    vKey  := 'PASSCODE';
  8    vHashed := DBMS_CRYPTO.MAC(
  9      src => UTL_I18N.STRING_TO_RAW (vText, 'AL32UTF8'),
 10      typ => DBMS_CRYPTO.HMAC_SH1,
 11      key => UTL_I18N.STRING_TO_RAW(vKey, 'AL32UTF8'));
 12    DBMS_OUTPUT.PUT_LINE(vHashed);
 13  END;
 14  /
A632FE8B642A386ADA5400D33AD124EB13D860CB
 
PL/SQLプロシージャが正常に完了しました。

要注意

機能が似通った HASH 関数と MAC 関数において、暗号化方式タイプのリテラル値 DBMS_CRYPTO.HMAC_SH1 の設定値と MAC 関数用の DBMS_CRYPTO.HASH_MD5 のリテラル値が同じ数値で定義されている。コード流用や混同により間違ったアルゴリズムを指定してしまう危険性がある。特にコピー&ペースト時には注意したい。

MAC ファンクションを MD5(128 ビット) で使用例

SQL> DECLARE
  2    vKey     VARCHAR2(2000);
  3    vHashed  RAW(16);
  4    vText    VARCHAR2(2000);
  5  BEGIN
  6    vText := 'ハッシュ化したい文字列';
  7    vKey  := 'PASSCODE';
  8    vHashed := DBMS_CRYPTO.MAC(
  9      src => UTL_I18N.STRING_TO_RAW (vText, 'AL32UTF8'),
 10      typ => DBMS_CRYPTO.HMAC_MD5,
 11      key => UTL_I18N.STRING_TO_RAW(vKey, 'AL32UTF8'));
 12    DBMS_OUTPUT.PUT_LINE(vHashed);
 13  END;
 14  /
B974A40CB7B1240A022CCF25A79C9E46
 
PL/SQLプロシージャが正常に完了しました。

補足 ORA_HASH は 32 ビット相当+シード値の指定ができる。バケットサイズの指定も可能。

SQL> select
  2   ORA_HASH('ハッシュ化したい文字列') HASH_NUM,
  3   to_char(ORA_HASH('ハッシュ化したい文字列'),'XXXXXXXX') HASH_HEX
  4  from dual;
 
  HASH_NUM HASH_HEX
---------- ---------
2695947463  A0B0E4C7
SQL> select
  2   ORA_HASH('ハッシュ化したい文字列', 1234) HASH_NUM,
  3   to_char(ORA_HASH('ハッシュ化したい文字列',1234),'XXXXXXXX') HASH_HEX
  4  from dual;
 
  HASH_NUM HASH_HEX
---------- ---------
       508       1FC


乱数、暗号化、ハッシュ関連事項

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ 会員制(無料)の公式技術サイト