Archivos Mensuales: octubre 2014

Enlace

Oracle Day 2014 - Madrid

Oracle Day 2014 – Madrid.

Anuncios

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