15

重複の可能性:
PL / SQLにハッシュ関数はありますか?

Oracle11gにNCLOBデータベースタイプの列があります。そのコンテンツのハッシュ値を取得する必要があります。組み込みのOracle関数を使用して、またはOracleのPL / SQL SP内でこれを行うにはどうすればよいですか?

4

1 に答える 1

38

はい:ハッシュと暗号化(関連していますが、まったく同じではありません)はすべて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()が次のハッシュアルゴリズムをサポートしていることは注目に値します。

  • HASH_MD4
  • HASH_MD5
  • HASH_SH1

パスワード:念のため

パスワードを保存する場合は、暗号化ハッシュ(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を介した暗号化を探している可能性があります。これは、次のタイプを使用することを除いて、非常によく似ています。

  • ENCRYPT_DES
  • ENCRYPT_3DES_2KEY
  • ENCRYPT_3DES
  • ENCRYPT_AES
  • ENCRYPT_PBE_MD5DES
  • ENCRYPT_AES128
  • ENCRYPT_AES192
  • ENCRYPT_AES256

これは、 DBMS_CRYPTOに関する完全な11gR2ドキュメントです。他のすべてのバージョンは、tahiti.oracle.comから入手できます。バージョンをクリックして、「dbms_crypto」を検索してください。

于 2012-06-18T16:36:03.447 に答える