Generación de Firma Alfanumérica

eagleSiempre nos había parecido interesante el tema de las sumas de verificación hash, un muy bonito conjunto de 32 o 16 bytes. Algo muy util cuando se trata de transferencia de archivos, pero algo muy inutil si se tratara de darle esa suma de verificación a una persona, e intente recordarla. Asi que desarrollamos este código que apartir de una suma de verificación, genera un código alfanumérico, muchísimo mas corto y facil de recordar, obviamente, esto variará dependiendo los parámetros que le enviemos. Pero aca está el código y espero les sea de utilidad.

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.util.Random;
import org.apache.commons.io.IOUtils;

/**
 * Manejo de firmas basadas en algoritmos de verificación
 * @author bit502
 */
public class Signature {
    
    public final static String MD2 = "MD2";
    public final static String MD5 = "MD5";
    public final static String SHA1 = "SHA-1";
    public final static String SHA256 = "SHA-256";
    public final static String SHA384 = "SHA-384";
    public final static String SHA512 = "SHA-512";
    
    public final static String USASCII = "US-ASCII";
    public final static String ISO88591 = "ISO-8859-1";
    public final static String UTF8 = "UTF-8";
    public final static String UTF16BE = "UTF-16BE";
    public final static String UTF16LE = "UTF-16LE";
    public final static String UTF16 = "UTF-16";
        
    /**
     * Devuelve una firma de tipo alfanumérico a partir de un arreglo de bytes
     * @param data Arraglo de bytes o datos a obtener la firma
     * @param numBits número de bits sobre los cuales se desea obtener la firma 2^numBits
     * @param Algorithm algoritmo a ser utilizado utilice: MD2, MD5, SHA-1, SHA-256, SHA-384, SHA-512.
     * @return firma de la data ingresada
     * @throws Exception 
     */
    public static String getSignature(byte[] data, int numBits, String Algorithm) throws Exception {
        byte[]codingData = MessageDigest.getInstance(Algorithm).digest(data);
        ByteBuffer buffer = ByteBuffer.allocate(codingData.length);
        buffer.put(codingData);
        buffer.flip();
        return new BigInteger(numBits, new Random(buffer.getLong())).toString(32).toUpperCase();
    }
    
    /**
     * Devuelve una firma de tipo alfanumérico a partir de un archivo
     * @param file Archivo a obtener la firma
     * @param numBits número de bits sobre los cuales se desea obtener la firma 2^numBits
     * @param Algorithm algoritmo a ser utilizado utilice: MD2, MD5, SHA-1, SHA-256, SHA-384, SHA-512.
     * @return firma del archivo ingresado
     * @throws Exception 
     */
    public static String getSignature(File file, int numBits, String Algorithm) throws Exception {
        InputStream inputstream = new FileInputStream(file);
        byte[] io = IOUtils.toByteArray(inputstream);
        return getSignature(io, numBits, Algorithm);
    }
    
    /**
     * Devuelve una firma de tipo alfanumérico a partir de un String
     * @param textPlain String a obtener la firma
     * @param numBits número de bits sobre los cuales se desea obtener la firma 2^numBits
     * @param Algorithm algoritmo a ser utilizado utilice: MD2, MD5, SHA-1, SHA-256, SHA-384, SHA-512.
     * @param charset Secuencia de caracteres sobre los que se desea trabajar
     * utilice: US-ASCII, ISO-8859-1, UTF-8, UTF-16BE, UTF-16LE, UTF-16
     * @return firma del String ingresado
     * @throws Exception 
     */
    public static String getSignature(String textPlain, int numBits, String Algorithm, String charset) throws Exception {
        byte[] b = textPlain.getBytes(Charset.forName(charset));
        return getSignature(b,numBits,Algorithm);
    }
    
}

Un ejemplo de implementación sería el siguiente:

import java.io.File;
import java.io.IOException;
/**
 *
 * @author bit502
 */
public class testSignature {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException, Exception {
        
        String algoritmo = Signature.MD5;
        int numBits = 24;
        
        byte[] b =  {0x01, 0x02, 0x03};
        File archivo = new File("C:\\WINDOWS\\notepad.exe");
        String textPlain = "Hola mundo!";
        String charset = Signature.UTF8;
        
        String signatureOfByte = Signature.getSignature(b, numBits, algoritmo);
        System.out.println("Firma del arreglo de bytes 0x1,0x2,0x3"+
                " bajo el algoritmo "+algoritmo+" a "+numBits+"bits es: "+signatureOfByte);
        
        String signatureOfFile = Signature.getSignature(archivo, numBits, algoritmo);
        System.out.println("Firma del archivo "+archivo.getAbsolutePath()+
                " bajo el algoritmo "+algoritmo+" a "+numBits+"bits es: "+signatureOfFile);
        
        String signatureOfString = Signature.getSignature(textPlain, numBits, algoritmo, charset);
        System.out.println("Firma del texto "+textPlain+
                " bajo el algoritmo "+algoritmo+" y codificación de caracteres "+charset+" a "+numBits+"bits es: "+signatureOfString);
    
    }
    
}

Sin título

El resultado del anterior test da como resultado lo siguiente:

Firma del arreglo de bytes 0x1,0x2,0x3 bajo el algoritmo MD5 a 24bits es: 2I6CG
Firma del archivo C:\WINDOWS\notepad.exe bajo el algoritmo MD5 a 24bits es: 2DHPF
Firma del texto Hola mundo! bajo el algoritmo MD5 y codificación de caracteres UTF-8 a 24bits es: CK0G4

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.