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'.
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. –
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 –