2012-06-17 40 views
14

Duplicar posible:
Is there any hash function in PL/SQL?¿Oracle tiene alguna función hash incorporada?

que tiene una columna con NCLOB tipo de base de datos en Oracle 11g. Necesito obtener un valor hash para su contenido. ¿Cómo puedo hacer esto usando cualquier función incorporada de Oracle o dentro de un SP PL/SQL en Oracle?

+0

Consulte dbms_crypto.hash http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_crypto.htm#ARPLS65700. No veo una versión que tome NCLOB, no sé cómo 'src IN CLOB CHARACTER SET ANY_CS' podría tomar un NCLOB sin pérdida en todos los casos. Algo para investigar. –

+0

Esta pregunta no es un duplicado * exacto *. Hay algunas diferencias sutiles pero significativas entre hashing un NCLOB o un VARCHAR2. Específicamente, hash de un NCLOB puede no ser determinista si usa ORA_HASH, por lo que una de las respuestas para la otra pregunta puede no ser adecuada. Consulte mi respuesta aquí para obtener información sobre hashing determinístico: http://stackoverflow.com/a/9476696/409172 –

Respuesta

38

Sí: el hash y el cifrado (relacionados pero no exactamente iguales) se realizan a través del paquete SYS DBMS_CRYPTO.

simple SHA-1 Hashing

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

simple MD5 Hashing

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

Descripción general de dbms_crypto.hash()

está sobrecargado La función hash() para aceptar los siguientes tipos: RAW, BLOB, a nd CLOB. De acuerdo con implicity data conversions para tipos de entrada sin procesar aceptables, son RAW, CHAR, VARCHAR2, NCHAR, NVARCHAR2, LONG, BLOB. Todos los demás tipos de datos (DATE, TIMESTAMP, etc.) no cubiertos en RAW/conversión RAW implícita, BLOB y CLOB deberán pasarse primero a TO_CHAR().

Vale la pena señalar que dbms_crypto.hash() soporta los siguientes algoritmos hash:

  • HASH_MD4
  • HASH_MD5
  • HASH_SH1

Contraseñas: Apenas en caso

Si está almacenando contraseñas, Sugiero que use un hash de almacenamiento de contraseñas (bcrypt, PBKDF2 o scrypt) en lugar de un hash criptográfico (md5, sha-1, etc.). La diferencia es que los hashes de almacenamiento de contraseñas están destinados a tomarse un tiempo para romperse, mientras que los hashes criptográficos deben hacerse rápidamente. Al atacar la lista de contraseñas de un sistema a través de la fuerza bruta, ordena de una magnitud más intensiva en tiempo cuando intenta romper un valor salado que se pasa a través de un algoritmo criptográfico. Considere que usar un hash de contraseña en un solo valor puede tomar ~ 100ms (no mucho para un único inicio de sesión auténtico), pero muy lento para una fuerza bruta (millones/billones de intentos por contraseña) en toda su lista de contraseñas.

Oracle Hates hashes

Por lo que su valor no estoy al tanto de cualquier paquete de Oracle que proporcionan soporte de hash de contraseñas. Sin embargo, puede lograr esto utilizando 'loadjava' y colocando una implementación Java bcrypt dentro de la JVM que se ejecuta con el RDBMS de Oracle. A continuación, puede utilizar un PL/SQL wrapper para llamar a su clase Java que implementa bcrypt. Si está utilizando un nivel intermedio, puede usar muchas otras opciones disponibles en ese idioma (.NET, PHP, Perl, Ruby, Python, Java, etc.) y omitir el uso de 'loadjava'.

Me refiero al cifrado no hash!

En caso de que el hash que necesita no está cubierto por dbms_crypto.hash(), que podría estar buscando para el cifrado a través de dbms_crypto.encrypt que funciona de manera muy similar excepto que toma en los siguientes tipos:

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

Aquí es la plena 11gR2 documentation on DBMS_CRYPTO. Todas las demás versiones están disponibles a través del tahiti.oracle.com. Simplemente haga clic en su versión y luego busque 'dbms_crypto'.

+0

De alguna manera, esta es una respuesta mejor que la respuesta aceptada en la pregunta duplicada. Ejemplos de código y detalles, versus solo un enlace a una guía. –

+0

OTOH, y realmente vale -1, uno generalmente quiere usar un hash criptográfico de salt + contraseña, no cifrado, para almacenar contraseñas (a menos que sea necesario poder extraer la contraseña, pero da miedo). Consulte http: // security.stackexchange.com/questions/8945/what-is-the-use-of-password-encryption –

+0

@ShannonSeverance Me temo que no puedo discutir el punto de forma más inteligente que la vinculación de un artículo con alguien que sea un experto; Por favor, acepte mis disculpas. Si tiene ideas al respecto, siempre estoy abierto a escuchar nuevas ideas. Trabajo con la suposición actual de que los algoritmos de cifrado sin sal y los algoritmos de hash sin sal son reversibles. Los hashes son de una sola manera hasta que alguien los revierte, lo cual no es mucho. Con eso en mente, considere qué es diferente sobre ellos. http://krebsonsecurity.com/2012/06/how-companies-can-beef-up-password-security/ –

Cuestiones relacionadas