Anuncio publicitario
Archivo por meses: octubre 2014
Generar SHA de una cadena (PL/SQL + Java)
El paquete DBMS_CRYPTO nos permite generar hash de una cadena de texto utilizando distintos algoritmos como MD4, MD5 y SHA1. Pero si queremos generar un hash mediante SHA-256, SHA-384 o SHA-512 tenemos que apoyarnos en Java. Los siguientes bloques de código incorporan la posibilidad de generar estos hash desde SQL o PL/SQL.
Los algoritmos disponibles son los siguientes:
- MD5
- SHA-1
- SHA-256
- SHA-384
- SHA-512
El primer paso es crear la clase Java que nos permita generar hash más complejos y compilarla en la base de datos:
create or replace and compile java source named encoder as package com.test; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import sun.misc.BASE64Encoder; public class Encoder { public static String encode(String message, String algorithm) { String encodedMessage; try { MessageDigest messageDigest = MessageDigest.getInstance(algorithm); byte[] hash = messageDigest.digest(message.getBytes("UTF-8")); encodedMessage = (new BASE64Encoder()).encode(hash); } catch (Exception e) { encodedMessage = null; } return encodedMessage; } }
Una vez compilada la clase Java en nuestra base de datos, es necesario crear una función PL/SQL de enlace para poder invocar la clase desde una sentencia SQL o desde código PL/SQL:
create or replace function encoder(p_string in varchar2, p_algorithm in varchar2) return varchar2 as language java name 'com.test.Encoder.encode(java.lang.String, java.lang.String) return String';
Por último, un ejemplo de uso:
select Encoder('Hello', 'SHA-256') "hash_Hello", Encoder('HELLO', 'SHA-256') "hash_HELLO" from dual;
hash_Hello -------------------------------------------- GF+NsyJx/iX1Yab8k4suJkMG7DBO2lGAB9F2SCY4GWk= hash_HELLO -------------------------------------------- NzPNl3/46xi5hzV+Is7Zn0YJfzHssjnoeK5jdg6D5NU=
Ver también Generar SH1 de una cadena y Generar el HASH de una cadena