martes, 20 de enero de 2009

Encriptar contraseñas

Las más usadas con sha1 y md5

MD5 es un algoritmo de generación de resúmenes de mensajes de longitud arbitraria que genera salidas (resúmenes o firmas) de 128 bits.

SHA1 es otro algoritmo de generación de resúmenes de mensajes de longitud inferior a 2^64 bits que genera salidas de 160 bits.

Ambos algoritmos se caracterizan por lo siguiente:

- es virtualmente imposible que dos mensajes distintos produzcan la misma firma.

- conocida la firma de un mensaje, es computacionalmente imposible obtener el mensaje.

- no se basan en clave, sino en una función criptográfica perfectamente conocida, pero de una sola vía (el conocimiento de la entrada determina el conocimiento de la salida, pero no a la inversa).

Método MD5.

public static String md5(String s) {

String r = null;
try {
if (s != null) {

MessageDigest algorithm =MessageDigest.getInstance("MD5");
algorithm.reset();
algorithm.update(s.getBytes());
byte bytes[] = algorithm.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(0xff & bytes[i]);
if (hex.length() == 1)
sb.append('0');
sb.append(hex);
}

r = sb.toString();
}
} catch (NoSuchAlgorithmException e) {
}

return r;

}


Clase sha1

package com.kriter.utils;

import sun.misc.BASE64Encoder;
import java.io.ByteArrayInputStream;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
* Created by IntelliJ IDEA.
* User: alopez
* Date: 04-jul-2006
* Time: 11:06:38
* To change this template use File | Settings | File Templates.
*/
public final class SHA1
{

public static String encriptarBase64( String textoplano ) throws IllegalStateException
{
MessageDigest md = null;

try
{
md = MessageDigest.getInstance( \"SHA\" ); // Instancia de generador SHA-1
}
catch( NoSuchAlgorithmException e )
{
throw new IllegalStateException( e.getMessage() );
}

try
{
md.update( textoplano.getBytes( \"UTF-8\" ) ); // Generación de resumen de mensaje
}
catch( UnsupportedEncodingException e )
{
throw new IllegalStateException( e.getMessage() );
}

byte raw[] = md.digest(); // Obtención del resumen de mensaje
return ( new BASE64Encoder() ).encode( raw ); // Traducción a BASE64
}

public static String encriptarHexadecimal( String textoplano ) throws IllegalStateException
{
MessageDigest md = null;

try
{
md = MessageDigest.getInstance( \"SHA\" ); // Instancia de generador SHA-1
}
catch( NoSuchAlgorithmException e )
{
throw new IllegalStateException( e.getMessage() );
}

try
{
md.update( textoplano.getBytes( \"UTF-8\" ) ); // Generación de resumen de mensaje
}
catch( UnsupportedEncodingException e )
{
throw new IllegalStateException( e.getMessage() );
}

byte raw[] = md.digest(); // Obtención del resumen de mensaje
return toHexadecimal( raw ); // Traducción a HEXADECIMAL
}

//metodo que devuelve el valor hexadecimal (String) de una array de byte.
private static String toHexadecimal( byte[] datos )
{
String resultado = \"\";
ByteArrayInputStream input = new ByteArrayInputStream( datos );
String cadAux;
int leido = input.read();
while( leido != -1 )
{
cadAux = Integer.toHexString( leido );
if ( cadAux.length() < 2 ) //Hay que añadir un 0
resultado += \"0\";
resultado += cadAux;
leido = input.read();
}
return resultado;
}
}