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 ビット) で使用した例
実行するには権限が必要 ⇒ 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
乱数、暗号化、ハッシュ関連事項