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

DBMS_CRYPTO 使用例 〜ハッシュ〜

鍵付きのハッシュ関数

SHA-1 と MD5

MD5 は Message Digest algorithm 5 の略、SHA-1 / SHA-2 とは Secure Hash Algorithm の略である。どちらも ハッシュを生成するための仕組みであるが、脆弱性や強度(※1) の観点から SHA であっても SHA-1 ではなく SHA-2 が推奨されている。(※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 ビットのハッシュ値を戻す。SHA-2 (Oracle 12c ~) では 256 / 386 / 512 ビットの 3種類があり 512 ビットが一番強度が高い。

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

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

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

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2    vHashed	RAW(32);
  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_SH256
  9    );
 10    DBMS_OUTPUT.PUT_LINE(vHashed);
 11* END;
95E078A4EE1B6165083B529B6C22DF6861C220B81F20FDBEA32E79C31D39665D
 
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
 


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

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ オラクルサポートセンター