Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Hat Oracle eine eingebaute Hash-Funktion?

Ja:Hashing und Verschlüsselung (verwandt, aber nicht genau gleich) werden alle über das SYS-Paket DBMS_CRYPTO durchgeführt.

Einfaches SHA-1-Hashing

l_hash := dbms_crypto.hash( l_src, dbms_crypto.HASH_SH1 );

Einfaches MD5-Hashing

l_hash := dbms_crypto.hash( l_src, dbms_crypto.HASH_MD5 );

Übersicht über dbms_crypto.hash()

Die Funktion hash() ist überladen, um die folgenden Typen zu akzeptieren:RAW, BLOB und CLOB. Gemäß der Implizitätsdatenkonvertierungen Zulässige Rohdaten-Eingabetypen sind RAW, CHAR, VARCHAR2, NCHAR, NVARCHAR2, LONG, BLOB. Alle anderen Datentypen (DATE, TIMESTAMP usw.), die nicht unter RAW/implizite RAW-Konvertierung, BLOB und CLOB fallen, müssen zuerst durch TO_CHAR() geleitet werden.

Es ist erwähnenswert, dass dbms_crypto.hash() die folgenden Hash-Algorithmen unterstützt:

  • HASH_MD4
  • HASH_MD5
  • HASH_SH1

Passwörter:Nur für den Fall

Wenn Sie Passwörter speichern, schlage ich vor, dass Sie anstelle eines kryptografischen Hashs (md5, sha-1 usw.) einen Passwortspeicher-Hash (bcrypt, PBKDF2 oder scrypt) verwenden. Der Unterschied besteht darin, dass Passwortspeicher-Hashes einige Zeit in Anspruch nehmen sollen, während kryptografische Hashes schnell erstellt werden sollen. Beim Angriff auf die Passwortliste eines Systems per Brute Force ist es um Größenordnungen zeitaufwändiger, wenn versucht wird, einen gesalzenen Wert zu brechen, der durch einen kryptografischen Algorithmus geleitet wird. Bedenken Sie, dass die Verwendung eines Passwort-Hashs für einen einzelnen Wert ~100 ms dauern kann (nicht viel für eine einzelne authentische Anmeldung), aber sehr langsam für eine Brute-Force (Millionen/Milliarden Versuche pro Passwort) über Ihre gesamte Passwortliste.

Oracle hasst Passwort-Hashes

Für das, was es wert ist, sind mir keine Pakete von Oracle bekannt, die Kennwort-Hashing-Unterstützung bieten. Sie können dies jedoch erreichen, indem Sie 'loadjava ' und Einfügen einer Java-bcrypt-Implementierung in die JVM, die im RDBMS von Oracle ausgeführt wird. Sie können dann einen PL/SQL-Wrapper um Ihre Java-Klasse aufzurufen, die bcrypt implementiert. Wenn Sie eine mittlere Ebene verwenden, können Sie viele andere Optionen verwenden, die Ihnen in dieser Sprache zur Verfügung stehen (.NET, PHP, Perl, Ruby, Python, Java usw.) und den Versuch, 'loadjava' zu verwenden, überspringen.

Ich meinte Verschlüsselung, nicht Hashes!

Falls das von Ihnen benötigte Hashing nicht von dbms_crypto.hash() abgedeckt wird, suchen Sie möglicherweise nach einer Verschlüsselung über dbms_crypto.encrypt, die sehr ähnlich funktioniert, außer dass sie die folgenden Typen akzeptiert:

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

Hier ist die vollständige 11gR2-Dokumentation zu DBMS_CRYPTO . Alle anderen Versionen sind über tahiti.oracle.com verfügbar . Klicken Sie einfach auf Ihre Version und suchen Sie dann nach „dbms_crypto“.