sql >> Base de Datos >  >> RDS >> Oracle

¿Oracle tiene alguna función hash incorporada?

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

Hashing SHA-1 simple

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

Hashing MD5 simple

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

Descripción general de dbms_crypto.hash()

La función hash() está sobrecargada para aceptar los siguientes tipos:RAW, BLOB y CLOB. Según las conversiones de datos de implicidad para los tipos de entrada aceptables sin formato son RAW, CHAR, VARCHAR2, NCHAR, NVARCHAR2, LONG, BLOB. Todos los demás tipos de datos (FECHA, MARCA DE TIEMPO, etc.) que no estén cubiertos por la conversión RAW/RAW implícita, BLOB y CLOB deberán pasar primero por TO_CHAR().

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

  • HASH_MD4
  • HASH_MD5
  • HASH_SH1

Contraseñas:por si acaso

Si está almacenando contraseñas, le 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 tardar en romperse, mientras que los hashes criptográficos están destinados a realizarse rápidamente. Al atacar la lista de contraseñas de un sistema a través de la fuerza bruta, requiere mucho más tiempo cuando intenta romper un valor salado que se pasa a través de un algoritmo criptográfico. Tenga en cuenta que el uso de un hash de contraseña en un solo valor puede tardar ~100 ms (no mucho para un solo 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 odia los hashes de contraseña

Por lo que vale, no tengo conocimiento de ningún paquete de Oracle que brinde soporte para el hash de contraseñas. Sin embargo, puede lograr esto usando 'loadjava ' y colocando una implementación de Java bcrypt dentro de la JVM que se ejecuta dentro del RDBMS de Oracle. Luego puede usar un contenedor PL/SQL 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 intento de usar 'loadjava'.

¡Quise decir encriptación, no hashes!

En caso de que el hash que necesita no esté cubierto por dbms_crypto.hash(), es posible que esté buscando el cifrado a través de dbms_crypto.encrypt, que funciona de manera muy similar, excepto que admite los siguientes tipos:

  • ENCRYPT_DES
  • CLAVE ENCRYPT_3DES_2
  • ENCRYPT_3DES
  • ENCRYPT_AES
  • ENCRYPT_PBE_MD5DES
  • ENCRYPT_AES128
  • ENCRYPT_AES192
  • ENCRYPT_AES256

Aquí está la documentación completa 11gR2 sobre DBMS_CRYPTO . Todas las demás versiones están disponibles a través de tahiti.oracle.com . Simplemente haga clic en su versión y luego busque 'dbms_crypto'.