DBMS_CRYPTO > DBMS_CRYPTO 使用方法 〜ハッシュ〜

DBMS_CRYPTO 使用例 〜ハッシュ〜

鍵付きのハッシュ関数

SHA-1 と MD5

MD5 は Message Digest algorithm 5 の略、SHA-1 とは Secure Hash Algorithm 1 の略である。どちらも ハッシュを生成するための仕組みであるが、脆弱性や強度(※1) の観点からアメリカの標準のハッシュは SHA-1 となっている。(※2)

(※1) MD5 は、現在のパソコンスペックで数十分で突破されてしまうまでになっている。

(※2) SHA-1 も NIST(National Institute of Standards and Technology / 米:国立標準技術研究所)による 「暗号化の2010年問題」に含まれる = 80bit の暗号と同じ強度と評価されているため SHA-2 への移行が推奨されている。
但し、移行が必要とされているのは電子署名を発行するアプリに該当する場合。早期の対応を期待したい。

特定のアプリケーションの閉じた世界でのデータの改ざんを検出するには HASH 関数より秘密鍵を使用した DBMS_CRYPTO.MAC 関数 を使用することが望ましい。

DBMS_CRYPTO.HASH ファンクション

DBMS_CRYPTO.HASH は RAW 型、BLOB 型 または CLOB 型のメッセージを「指定したハッシュアルゴリズム」を使用してハッシュ値に変換する。
MD5 アルゴリズムは 128 ビット、SHA-1 では 160 ビットのハッシュ値を戻す。

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

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

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2    vHashed  RAW(20);
  3    vText    VARCHAR2(2000);
  4  BEGIN
  5    vText := 'ハッシュ化したい文字列';
  6    vHashed := DBMS_CRYPTO.HASH(
  7      src => UTL_I18N.STRING_TO_RAW (vText, 'AL32UTF8'), -- ← UTF8 に変換後 RAW へ
  8      typ => DBMS_CRYPTO.HASH_SH1
  9    );
 10    DBMS_OUTPUT.PUT_LINE(vHashed);
 11  END;
 12  /
5B649F3B252626CA38B7680270C4889E606BE79C
 
PL/SQLプロシージャが正常に完了しました。

ポイント 入力文字列 vText を AL32UTF8 に変換し RAW 型にすることでデータベースキャラクタセットが異なるプラットフォームでも同じハッシュ値を生成する。

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

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

HASH ファンクションを MD4(128 ビット)で使用した例

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2    vHashed  RAW(20);
  3    vText    VARCHAR2(2000);
  4  BEGIN
  5    vText := 'ハッシュ化したい文字列';
  6    vHashed := DBMS_CRYPTO.HASH(
  7      src => UTL_I18N.STRING_TO_RAW (vText, 'AL32UTF8'),
  8      typ => DBMS_CRYPTO.HASH_MD4
  9    );
 10    DBMS_OUTPUT.PUT_LINE(vHashed);
 11  END;
 12  /
17729C8679CB923EA8D95EC8FA0DFCE9
 
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


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

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