ORA_HASH ファンクション(ハッシュ値の取得)
ハッシュ値への変換 ( ORA_HASH )
- 書式
- ORA_HASH(expr [,max_bucket, seed_value] )
max_bucket デフォルト値:4294967295
seed_value デフォルト値:0
ハッシュコードを計算する。(バケット数とシードが一緒であれば、同じ expr は同じハッシュ値を戻す)
そのためパスワードをハッシュに変換した形で格納する場合などに使用できる。(※)
(※) テキストで保持するよりは良い程度なので STANDARD_HASH や 暗号化ツールキット の 鍵付きハッシュ HMAC(DBMS_CRYPTO) などのハッシュ値の方が安全性は高い。
暗号化ツールキットは Standard Edition でも使うことができ Advance Security Option ライセンスも不要
ORA_HASH 使用例
最大バケット 65535 、シード 1
SQL> select ORA_HASH('hoge', 65535, 1) from dual;
ORA_HASH('HOGE',65535,1)
------------------------
6477
最大バケット 65535 、シード 2
SQL> select ORA_HASH('hoge', 65535, 2) from dual;
ORA_HASH('HOGE',65535,2)
------------------------
60503
最大バケット 65535 、シード 1 (最初と同じ)
SQL> select ORA_HASH('hoge', 65535, 1) from dual;
ORA_HASH('HOGE',65535,1)
------------------------
6477 ← seed が同じなので常に同じハッシュ値
バケット数が1つ減る(65535⇒65534)、シード 1 とハッシュ値も違う値になる
SQL> select ORA_HASH('hoge', 65534, 1) from dual;
ORA_HASH('HOGE',65534,1)
------------------------
32897
利用されるシーン および ORA_HASH と DBMS_CRYPTO.HASH (MD5)
- 不可逆変換関数なので、パスワードの確認などに使う場合には入力値を同じバケット数とシードでハッシュ値にしてからハッシュ値同士を比較する。
- SQL を管理する SQL_TEXT の内容もハッシュ値で管理されている。バケット数を十分大きく取ればアプリケーションコードを特定する値としても使用できる。
- ORA_HASH ファンクションの最大バケット数は 32 ビット(4,294,967,295) まで許可されている。
暗号化パッケージ (DBMS_CRYPTO) の MD5 でのハッシュのビット数は 128 ビット(約 3.4E+38)である。
- Oracle 9i 以前の場合には DBMS_UTILITY.GET_HASH_VALUE がある。ただバケット数に該当するものは 16 ビット相当である。
- ORA_HASH は SQL のビルトイン関数であるため PL/SQL による DBMS_UTILITY.GET_HASH_VALUE
や DBMS_CRYPTO パッケージを呼び出す場合に比べて格段に高速に処理される。
制限:今のところ BIN_TO_NUM や NVL2 と同様 PL/SQL に組み込まれていない。
関連パッケージのライセンス
暗号化ツールキット (SE 版でも使用可能)
DBMS_CRYPTO ハッシュ / DBMS_CRYPTO 鍵付きハッシュ
DBMS_OBFUSCATION_TOOLKIT 〜
関連 SQL 関数