Top > 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 / SHA-2 (Oracle 12c 以降) が利用できる。

DBMS_CRYPTO.MAC ファンクション

DBMS_CRYPTO.MAC は RAW 型、BLOB 型 または CLOB 型のメッセージを「指定した秘密鍵」と「指定したハッシュアルゴリズム」を使用してハッシュ値に変換することができる。
MD5 アルゴリズムは 128 ビット、SHA-1 では 160 ビットのハッシュ値を戻す。強度は SHA-1 を使用した方が優れており MD5 より SHA-1 の利用が薦められている。(~ Oracle 11gR2)
Oracle 12c からは SHA-2 の 256 bit/ 384 bit / 512 bit が追加されており SHA-2 の使用が推奨されている。

参考 ⇒ ハッシュのアルゴリズムタイプの定数一覧

MAC ファンクション を SHA-2(512 ビット)Oracle 12c で使用した例

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

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  1    vKey	VARCHAR2(2000);
  2    vHashed	RAW(512/8);		-- 512bit Oracle 12c R2 ~ 静的な式
  3    -- vHashed	RAW(64);	--      ~ Oracle 12c R1
  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_SH512,
 11	 key => UTL_I18N.STRING_TO_RAW(vKey, 'AL32UTF8'));
 12    DBMS_OUTPUT.PUT_LINE(vHashed);
 13  END;
 14  /
FE6E9B4459ED4A151AB986E466E7CA ...略... 6DE95E76F7837B5D5967AB9B8E3067
 
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);	-- 128bit
  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


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

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle Web セミナー