2012-06-17 16 views
14

Eventuali duplicati:
Is there any hash function in PL/SQL?Oracle ha una funzione hash incorporata?

Ho una colonna con NCLOB tipo di database in Oracle 11g. Ho bisogno di ottenere un valore hash per il suo contenuto. Come posso farlo utilizzando una funzione Oracle integrata o all'interno di un PL/SQL SP in Oracle?

+0

Vedere dbms_crypto.hash http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_crypto.htm#ARPLS65700. Non vedo una versione che richiede NCLOB, non so come se 'src IN CLOB CHARACTER SET ANY_CS' potrebbe prendere una NCLOB senza perdita in tutti i casi. Qualcosa da investigare. –

+0

Questa domanda non è un * esatto * duplicato. Esistono alcune differenze sottili ma significative tra l'hashing di un NCLOB o di un VARCHAR2. In particolare, l'hashing di una NCLOB potrebbe non essere deterministico se si utilizza ORA_HASH, quindi una delle risposte per l'altra domanda potrebbe non essere appropriata. Vedere la mia risposta qui per informazioni su hashing deterministico: http://stackoverflow.com/a/9476696/409172 –

risposta

38

Sì: hashing e crittografia (correlati ma non esattamente identici) vengono eseguiti tramite il pacchetto SYS DBMS_CRYPTO.

semplice SHA-1 Hashing

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

Semplice MD5 Hashing

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

Panoramica dbms_crypto.hash()

La funzione di hash() è sovraccarico per accettare i seguenti tipi: RAW, BLOB, a nd CLOB. Secondo lo implicity data conversions per i tipi di input accettabili non elaborati sono RAW, CHAR, VARCHAR2, NCHAR, NVARCHAR2, LONG, BLOB. Tutti gli altri tipi di dati (DATE, TIMESTAMP, ecc.) Non coperti dalla conversione RAW/implicita RAW, BLOB e CLOB dovranno prima essere passati attraverso TO_CHAR().

Vale la pena notare che dbms_crypto.hash() supporta i seguenti algoritmi di hashing:

  • HASH_MD4
  • HASH_MD5
  • HASH_SH1

password: nel caso in cui

Se si memorizzano le password, Suggerisco di utilizzare un hash di memorizzazione password (bcrypt, PBKDF2 o scrypt) invece di un hash crittografico (md5, sha-1, ecc.). La differenza è che gli hash di memorizzazione delle password hanno bisogno di tempo per interrompersi mentre gli hash crittografici devono essere eseguiti rapidamente. Quando si attacca un elenco di password di un sistema tramite la forza bruta, gli ordini di grandezza richiedono più tempo quando si tenta di interrompere un valore salato che viene passato attraverso un algoritmo crittografico. Considera che l'uso di un hash della password su un singolo valore può richiedere ~ 100ms (non molto per un singolo login autentico), ma molto lento per una forza bruta (milioni/miliardi di tentativi per password) sull'intero elenco di password.

Oracle Hates password Hash

Per quello che il suo valore non sono a conoscenza di eventuali pacchetti da Oracle che forniscono il supporto hashing delle password. Tuttavia, è possibile farlo utilizzando "loadjava" e inserendo un'implementazione di bcrypt Java all'interno della JVM che viene eseguita con l'RDBMS di Oracle. È quindi possibile utilizzare un PL/SQL wrapper per chiamare la classe Java che implementa bcrypt. Se si utilizza un livello intermedio, è possibile utilizzare molte altre opzioni disponibili in tale lingua (.NET, PHP, Perl, Ruby, Python, Java, ecc.) E saltare cercando di utilizzare "loadjava".

Intendevo la crittografia non hash!

Nel caso in cui l'hashing avete bisogno non è coperto da dbms_crypto.hash(), si potrebbe essere alla ricerca per la crittografia tramite dbms_crypto.encrypt che funziona in modo molto simile, tranne che ci vuole nelle seguenti tipologie:

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

Ecco il pieno 11gR2 documentation on DBMS_CRYPTO. Tutte le altre versioni sono disponibili tramite tahiti.oracle.com. Basta fare clic sulla tua versione e quindi cercare 'dbms_crypto'.

+0

In qualche modo questa è una risposta migliore rispetto alla risposta accettata nella domanda duplicata. Esempi di codice e dettagli, rispetto a un semplice collegamento a una guida. –

+0

OTOH, e vale veramente -1, in genere si desidera utilizzare un hash crittografico di sale + password, non crittografia, per memorizzare le password (a meno che non sia necessario estrarre la password, ma spaventosa.) Vedere http: // security.stackexchange.com/questions/8945/what-is-the-use-of-password-encryption –

+0

@ShannonSeverance Ho paura di non poter argomentare il punto in modo più intelligente del collegamento di un articolo a qualcuno che è un esperto; per favore accetta le mie scuse. Se hai pensieri sull'argomento, mi sto sempre aprendo per ascoltare nuove idee. Trovo che l'attuale ipotesi che gli algoritmi di crittografia non salati e gli algoritmi hash non salati siano entrambi reversibili. Gli hash sono a senso unico finché qualcuno non li inverte, il che non è lungo. Con questo in mente, considera ciò che è diverso su di loro. http://krebsonsecurity.com/2012/06/how-companies-can-beef-up-password-security/ –

Problemi correlati