miércoles, 7 de marzo de 2012

BlowFish en Java



Con esta entrada, os voy a enseñar cómo utilizar jBCrypt en Java. jBCrypt es una implementación de OpenBSD BlowFish (el cual también pondré cómo usar en otra entrada aparte), principalmente coge un String y lo encripta con un generador de claves.

Lo curioso es que solamente podremos encriptar un String, pero no al revés. Vosotros diréis pues es absurdo, pues no necesariamente, aquí un ejemplo:

1) Pedimos a un cliente un usuario y una contraseña. Nos da por ejemplo usuario10 y pass10. 

2) Nosotros lo encriptamos usando jBCrypt, nos dará una String o un array de Bytes según usemos una función u otra. 

3) La guardamos en un fichero, una tabla en una Base de Datos, donde sea, pero la guardamos.

4) La próxima vez que ese usuario vaya a entrar al Sistema o a donde tenga que entrar, nosotros le pediremos usuario y contraseña. Ahora viene la gracia, comparamos lo que nos da el usuario con lo que tenemos guardado en nuestro fichero o base de datos. Si coincide, pues que siga. Si no coincide, más memoria para la próxima :)


Lo primero que tendremos que hacer es bajarnos el fichero jBCrypt.java que lo podréis encontrar aquí.

Una vez lo descargamos, se descomprime y se importa el fichero mencionado anteriormente. Para importar ese Java en nuestro proyecto, por ejemplo, con Eclipse, basta con arrastrarlo hasta el paquete que queramos o al src si queremos e indicar que es una copia y no un linkeo. En la siguiente imagen os podéis hacer una idea de cómo se debería de quedar. En mi caso lo meto en un paquete llamado encrypts.










Ahora vamos a encriptar por ejemplo dos Strings cualquiera.

Creamos una clase por ejemplo Encriptar(){} y la vamos a hacer principal, total es para probar, pero ya sabéis que esto lo suyo sería ponerlo en un paquete distinto con una clase distinta.

Quedaría más o menos de la siguiente manera:

public class Encriptar { //lo ponemos manualmente para probar private String usuario="paco", password="estoesseguro";
public static void main(String[] args) { //vamos a crear un archivo, donde ira usuario y password encriptado try{ FileWriter fw = new FileWriter(new File("C:/Ejemplo"+".java"+".bin"),); PrintWriter pw = new PrintWriter(fw); String usuario= BCrypt.hashpw(usuario, BCrypt.gensalt()); String password = BCrypt.hashpw(password, BCrypt.gensalt()); pw.println(usuario); pw.println(password); pw.close(); } catch(IOException ex) System.out.println("Error al crear fichero"); System.out.println("Fichero creado correctamente"); }
}



Ahora solo faltaría ver como comprobarlo. Otra clase Comprobar() o en la misma de antes...



File archivo = "C:/Ejemplo/java.bin";
String checkusuario=null, checkpass=null;
int cont=0;


try{
 FileReader fr = new FileReader(archivo);
 BufferedReader br = new BufferedReader(fr);
 linea = br.readLine();
     
  while(linea!=null){      
                 
    try{

                  
     if (cont%2==0) if (BCrypt.checkpw(checkusuario, linea)) Acceso=true;       
     if (cont%2==1) if (BCrypt.checkpw(checkpass, linea))  Acceso2=true;
   

    }

    catch(NullPointerException e){}
      
    linea=br.readLine();
    cont++;    
      
    
    if (Acceso && Acceso2) break;
      
      
      
  } // FIN WHILE
     
   br.close();  //CERRAR FICHERO




//AQUI VAN LAS EXCEPCIONES