sql >> Database >  >> RDS >> Oracle

Heeft Oracle een ingebouwde hashfunctie?

Ja:hashing en encryptie (gerelateerd maar niet precies hetzelfde) gebeurt allemaal via het SYS-pakket DBMS_CRYPTO.

Eenvoudige SHA-1-hashing

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

Eenvoudige MD5-hashing

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

Overzicht van dbms_crypto.hash()

De hash()-functie is overbelast om de volgende typen te accepteren:RAW, BLOB en CLOB. Volgens de impliciteit dataconversies voor onbewerkte aanvaardbare invoertypen zijn RAW, CHAR, VARCHAR2, NCHAR, NVARCHAR2, LONG, BLOB. Alle andere gegevenstypen (DATE, TIMESTAMP, enz.) die niet onder RAW/impliciete RAW-conversie, BLOB en CLOB vallen, moeten eerst via TO_CHAR() worden doorgegeven.

Het is vermeldenswaard dat dbms_crypto.hash() de volgende hash-algoritmen ondersteunt:

  • HASH_MD4
  • HASH_MD5
  • HASH_SH1

Wachtwoorden:voor het geval dat

Als u wachtwoorden opslaat, raad ik u aan een wachtwoordopslaghash (bcrypt, PBKDF2 of scrypt) te gebruiken in plaats van een cryptografische hash (md5, sha-1, enz.). Het verschil is dat het de bedoeling is dat hashes voor wachtwoordopslag de tijd nemen om te breken, terwijl cryptografische hashes bedoeld zijn om snel te worden gedaan. Bij het aanvallen van de wachtwoordlijst van een systeem via brute kracht, kost het veel meer tijd wanneer wordt geprobeerd een gezouten waarde te breken die door een cryptografisch algoritme wordt doorgegeven. Bedenk dat het gebruik van een wachtwoord-hash op een enkele waarde ~ 100 ms kan duren (niet veel voor een enkele authentieke login), maar erg traag voor een brute kracht (miljoenen/miljarden pogingen per wachtwoord) over uw hele wachtwoordlijst.

Oracle heeft een hekel aan wachtwoordhashes

Voor wat het waard is, ik ken geen pakketten van Oracle die ondersteuning bieden voor het hashen van wachtwoorden. U kunt dit echter bereiken door 'loadjava ' en het plaatsen van een Java bcrypt-implementatie binnen de JVM die draait binnen Oracle's RDBMS. U kunt dan een PL/SQL-wrapper om uw Java-klasse aan te roepen die bcrypt implementeert. Als u een middle-tier gebruikt, kunt u vele andere opties gebruiken die voor u beschikbaar zijn in die taal (.NET, PHP, Perl, Ruby, Python, Java, enz.) en het gebruik van 'loadjava' overslaan.

Ik bedoelde versleuteling, geen hashes!

In het geval dat de hashing die u nodig hebt niet wordt gedekt door dbms_crypto.hash(), zoekt u mogelijk naar codering via dbms_crypto.encrypt, dat ongeveer hetzelfde werkt, behalve dat het de volgende typen nodig heeft:

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

Hier is de volledige 11gR2 documentatie over DBMS_CRYPTO . Alle andere versies zijn beschikbaar via tahiti.oracle.com . Klik gewoon op uw versie en zoek vervolgens naar 'dbms_crypto'.




  1. Zoek de hostnaam in postgresql

  2. Maak een scalaire door de gebruiker gedefinieerde functie in SQL Server

  3. Converteer een maandnaam naar het maandnummer in SQL Server (T-SQL)

  4. Hoe selecteer ik slechts een deel van het enorme binaire bestand (bestand)?