Sì:l'hashing e la crittografia (correlati ma non esattamente uguali) vengono tutti eseguiti tramite il pacchetto SYS DBMS_CRYPTO.
Semplice hash SHA-1
l_hash := dbms_crypto.hash( l_src, dbms_crypto.HASH_SH1 );
Semplice hashing MD5
l_hash := dbms_crypto.hash( l_src, dbms_crypto.HASH_MD5 );
Panoramica di dbms_crypto.hash()
La funzione hash() è sovraccaricata per accettare i seguenti tipi:RAW, BLOB e CLOB. In base a implicita conversione dei dati per i tipi di input grezzi accettabili sono RAW, CHAR, VARCHAR2, NCHAR, NVARCHAR2, LONG, BLOB. Tutti gli altri tipi di dati (DATE, TIMESTAMP e così via) non coperti dalla conversione RAW/RAW implicita, BLOB e CLOB dovranno prima essere passati tramite TO_CHAR().
Vale la pena notare che dbms_crypto.hash() supporta i seguenti algoritmi di hashing:
- HASH_MD4
- HASH_MD5
- HASH_SH1
Password:per ogni evenienza
Se stai memorizzando le password, ti suggerisco di utilizzare un hash di archiviazione password (bcrypt, PBKDF2 o scrypt) invece di un hash crittografico (md5, sha-1, ecc.). La differenza è che gli hash di archiviazione delle password devono richiedere tempo per essere violati mentre gli hash crittografici devono essere eseguiti rapidamente. Quando si attacca l'elenco delle password di un sistema tramite la forza bruta, l'ordine di grandezza richiede più tempo quando si tenta di violare un valore salato che viene passato attraverso un algoritmo crittografico. Considera che l'utilizzo di un hash di password su un singolo valore può richiedere ~100 ms (non molto per un singolo accesso autentico), ma molto lento per una forza bruta (milioni/miliardi di tentativi per password) sull'intero elenco di password.
Oracle odia gli hash delle password
Per quel che vale, non sono a conoscenza di alcun pacchetto Oracle che fornisca supporto per l'hashing delle password. Tuttavia, puoi farlo utilizzando 'loadjava ' e inserendo un'implementazione Java bcrypt all'interno della JVM che viene eseguita con RDBMS di Oracle. È quindi possibile utilizzare un wrapper PL/SQL per chiamare la tua classe Java che implementa bcrypt. Se stai usando un livello intermedio puoi usare molte altre opzioni disponibili in quel linguaggio (.NET, PHP, Perl, Ruby, Python, Java, ecc.) e saltare il tentativo di usare 'loadjava'.
Intendevo la crittografia, non gli hash!
Nel caso in cui l'hashing di cui hai bisogno non sia coperto da dbms_crypto.hash(), potresti cercare la crittografia tramite dbms_crypto.encrypt che funziona in modo molto simile tranne per il fatto che accetta i seguenti tipi:
- ENCRYPT_DES
- ENCRYPT_3DES_2KEY
- ENCRYPT_3DES
- ENCRYPT_AES
- ENCRYPT_PBE_MD5DES
- ENCRYPT_AES128
- ENCRYPT_AES192
- ENCRYPT_AES256
Ecco la 11gR2 documentazione su DBMS_CRYPTO . Tutte le altre versioni sono disponibili tramite tahiti.oracle.com . Basta fare clic sulla tua versione e quindi cercare 'dbms_crypto'.