重複の可能性:
PL / SQLにハッシュ関数はありますか?
Oracle11gにNCLOBデータベースタイプの列があります。そのコンテンツのハッシュ値を取得する必要があります。組み込みのOracle関数を使用して、またはOracleのPL / SQL SP内でこれを行うにはどうすればよいですか?
重複の可能性:
PL / SQLにハッシュ関数はありますか?
Oracle11gにNCLOBデータベースタイプの列があります。そのコンテンツのハッシュ値を取得する必要があります。組み込みのOracle関数を使用して、またはOracleのPL / SQL SP内でこれを行うにはどうすればよいですか?
はい:ハッシュと暗号化(関連していますが、まったく同じではありません)はすべてSYSパッケージDBMS_CRYPTOを介して行われます。
単純なSHA-1ハッシュ
l_hash := dbms_crypto.hash( l_src, dbms_crypto.HASH_SH1 );
シンプルなMD5ハッシュ
l_hash := dbms_crypto.hash( l_src, dbms_crypto.HASH_MD5 );
dbms_crypto.hash()の概要
hash()関数は、RAW、BLOB、およびCLOBのタイプを受け入れるようにオーバーロードされています。生の許容可能な入力タイプの暗黙的なデータ変換によると、RAW、CHAR、VARCHAR2、NCHAR、NVARCHAR2、LONG、BLOBです。RAW /暗黙のRAW変換、BLOB、およびCLOBでカバーされていない他のすべてのデータ型(DATE、TIMESTAMPなど)は、最初にTO_CHAR()を通過する必要があります。
dbms_crypto.hash()が次のハッシュアルゴリズムをサポートしていることは注目に値します。
パスワード:念のため
パスワードを保存する場合は、暗号化ハッシュ(md5、sha-1など)の代わりにパスワード保存ハッシュ(bcrypt、PBKDF2、またはscrypt)を使用することをお勧めします。違いは、パスワードストレージハッシュは解読に時間がかかることを意図しているのに対し、暗号化ハッシュは迅速に実行することを意図していることです。ブルートフォースを介してシステムのパスワードリストを攻撃する場合、暗号化アルゴリズムを介して渡されるソルト値を破ろうとすると、桁違いに時間がかかります。単一の値でパスワードハッシュを使用すると、最大100ミリ秒かかる可能性がありますが(1回の本物のログインではそれほど多くありません)、パスワードリスト全体でブルートフォース(パスワードあたり数百万/数十億回の試行)には非常に時間がかかることを考慮してください。
Oracleはパスワードハッシュを嫌う
その価値について、私はパスワードハッシュサポートを提供するOracleのパッケージを知りません。ただし、これは、「loadjava」を使用し、OracleのRDBMSで実行されるJVM内にJavabcrypt実装を配置することで実現できます。次に、PL / SQLラッパーを使用して、 bcryptを実装するJavaクラスを呼び出すことができます。中間層を使用している場合は、その言語で使用できる他の多くのオプション(.NET、PHP、Perl、Ruby、Python、Javaなど)を使用して、「loadjava」の使用をスキップできます。
ハッシュではなく暗号化を意味しました!
必要なハッシュがdbms_crypto.hash()でカバーされていない場合は、dbms_crypto.encryptを介した暗号化を探している可能性があります。これは、次のタイプを使用することを除いて、非常によく似ています。
これは、 DBMS_CRYPTOに関する完全な11gR2ドキュメントです。他のすべてのバージョンは、tahiti.oracle.comから入手できます。バージョンをクリックして、「dbms_crypto」を検索してください。