Ja:hashing og kryptering (relateret, men ikke helt det samme) udføres alt sammen via SYS-pakken DBMS_CRYPTO.
Simpel SHA-1 hashing
l_hash := dbms_crypto.hash( l_src, dbms_crypto.HASH_SH1 );
Simpel MD5-hashing
l_hash := dbms_crypto.hash( l_src, dbms_crypto.HASH_MD5 );
Oversigt over dbms_crypto.hash()
Funktionen hash() er overbelastet til at acceptere følgende typer:RAW, BLOB og CLOB. Ifølge implicitte datakonverteringer for rå acceptable inputtyper er RAW, CHAR, VARCHAR2, NCHAR, NVARCHAR2, LONG, BLOB. Alle andre datatyper (DATE, TIMESTAMP osv.), der ikke er dækket af RAW/implicit RAW-konvertering, BLOB og CLOB, skal først sendes gennem TO_CHAR().
Det er værd at bemærke, at dbms_crypto.hash() understøtter følgende hashing-algoritmer:
- HASH_MD4
- HASH_MD5
- HASH_SH1
Adgangskoder:Bare for en sikkerheds skyld
Hvis du gemmer adgangskoder, foreslår jeg, at du bruger en hash til lagring af adgangskoder (bcrypt, PBKDF2 eller scrypt) i stedet for en kryptografisk hash (md5, sha-1 osv.). Forskellen er, at hashes til lagring af adgangskode er beregnet til at tage tid at bryde, mens kryptografiske hashes er beregnet til at blive gjort hurtigt. Når man angriber et systems adgangskodeliste via brute force, er det i størrelsesordener mere tidskrævende, når man forsøger at bryde en saltet værdi, der sendes gennem en kryptografisk algoritme. Overvej, at brug af en adgangskodehash på en enkelt værdi kan tage ~100ms (ikke meget for et enkelt autentisk login), men meget langsomt for en brute force (millioner/milliarder forsøg pr. adgangskode) over hele din adgangskodeliste.
Oracle hader hashes til adgangskode
For hvad det er værd, jeg er ikke bekendt med nogen pakker fra Oracle, der giver adgangskode-hashing-support. Du kan dog opnå dette ved at bruge 'loadjava ' og placere en Java bcrypt-implementering i JVM'et, der kører inden for Oracles RDBMS. Du kan derefter bruge en PL/SQL-indpakning a> at kalde din Java-klasse, der implementerer bcrypt. Hvis du bruger et mellemniveau, kan du bruge mange andre tilgængelige muligheder på det sprog (.NET, PHP, Perl, Ruby, Python, Java osv.) og springe over at prøve at bruge 'loadjava'.
Jeg mente kryptering ikke hashes!
I tilfælde af at den hashing, du har brug for, ikke er dækket af dbms_crypto.hash(), leder du muligvis efter kryptering via dbms_crypto.encrypt, som fungerer meget ens bortset fra, at den tager følgende typer:
- ENCRYPT_DES
- ENCRYPT_3DES_2KEY
- ENCRYPT_3DES
- ENCRYPT_AES
- ENCRYPT_PBE_MD5DES
- ENCRYPT_AES128
- ENCRYPT_AES192
- ENCRYPT_AES256
Her er den fulde 11gR2-dokumentation om DBMS_CRYPTO . Alle andre versioner er tilgængelige via tahiti.oracle.com . Bare klik på din version og søg derefter efter 'dbms_crypto'.