martes, 17 de enero de 2012

Criptografía simétrica y asimétrica

La criptografía se usa para ntercambiar mensajes que sólo puedan ser leídos por usuarios a las que van dirigidos y que poseen los medios para descifrarlos.

Mediante una clave secreta, ciframos un mensaje y después podemos descrifrar el mensaje con la misma clave u otra distinta. De esta forma hay dos tipos de algoritmos, según cantidad de claves:
  • Critografía simétrica
  • Criptografía asimétrica
Ahora os voy a explicar brevemente cada uno y al final tenéis una comparativa entra las dos.

lunes, 16 de enero de 2012

Exclusión mutua en Java con Lock

java.util.concurrent.locks.ReentrantLock es una clase en Java para la exclusión mutua, con el mismo comportamiento que los monitores Synchronized pero con más funciones. Entre ellas podemos encontrar:

  • 1. tryLock(): coger el cerrojo si es posible, sino devuelve false.
  • 2. tryLock(long timeout, TimeUnit unit): coger el cerrojo antes del timeout y devuelve false después del timeout.
  • 3. lockInterruptibly():intenta coger el cerrojo y entrar en el estado wait, pero puede ser interrumpido por otro hilos.

Para iniciarlo:
private Lock cerrojo = new ReentrantLock();


Un ejemplo de como asegurar una variable:
dialog.addWindowListener(new WindowAdapter(){
    publicvoid windowClosing(WindowEvent we){
        cerrojo.lock();
        desconectando = true;
        cerrojo.unlock();
    }

});
 
Aquí tenéis la documentación: Enlace. 

miércoles, 11 de enero de 2012

Ejemplo MD5 en Java

MD5 es uno algoritmo de reducción criptográfico.

MD5 se utiliza para comprobar que lo que descargamos de internet es el archivo original y no un troyano. También se utiliza para comprobar claves guardando el valor hash en disco y comparando con éste. Aplicando MD5 obtenemos un valor hash de 32 dígitos hexadecimales. Este valor se envía junto con el archivo. El usuario compara el valor hash del archivo obtenido con el valor hash que le han proporcionado y si no son iguales estamos seguros que el archivo ha sufrido un cambio y no es el original.
import java.io.FileInputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
 
public class MD5 {
    public static String getMD5(String entrada) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] messageDigest = md.digest(entrada.getBytes());
            BigInteger number = new BigInteger(1, messageDigest);
            String hashtext = number.toString(16);
            while (hashtext.length() < 32) {
                hashtext = "0" + hashtext;
            }
            return hashtext;
        }
        catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
 
    public static void main(String[] args) throws NoSuchAlgorithmException {
        System.out.println(getMD5("Nuestra Clave"));
    }
}

Podemos cambiar el algoritmo MD5 por MD2, MD4, SHA...

Añadir un evento a un botón Swing

Éste es el código para añadir un evento a un botón Swing en Java.
   private JButton boton = new JButton("Botón");

   boton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent arg0) {
         System.out.println("Click!");
      }
   }); 
 
Aquí tenéis la documentación: Enlace

No dejar redimensionar una ventana SWT

shell = new Shell(SWT.DIALOG_TRIM | SWT.MIN); 

De esta forma bloqueamos el redimensionamiento de una ventana(shell) en SWT. Sería el equivalente en swing de

frame.setResizable(false);


Escribimos en el constructor del shell las propiedades y listo.
Si queremos añadir más restricciones a la ventana podemos concatenar cualesquiera de esta lista:
SWT.BORDER 
SWT.CLOSE 
SWT.MIN 
SWT.MAX 
SWT.RESIZE 
SWT.TITLE 
SWT.NO_TRIM 
SWT.SHELL_TRIM 
SWT.DIALOG_TRIM 
SWT.MODELESS 
SWT.PRIMARY_MODAL 
SWT.APPLICATION_MODAL 
SWT.SYSTEM_MODAL 

Añadir una barra de progreso a un navegador embebido

Aquí os dejo el código para poder añadir una barra de de progreso a un navegador embebido que está incrustado en un composite de SWT.

public class NavegadorEmbebidoSWT extends Composite {
  private Browser browser;
  ProgressBar progressBar;
  boolean busy;
  int index;

  public NavegadorEmbebidoSWT(Composite parent, String urlEntorno) {
    super(parent, SWT.NONE);

    GridLayout layout = new GridLayout(2, true);
    setLayout(layout);

    browser = new Browser(this, SWT.NONE);
    GridData layoutData = new GridData(GridData.FILL_BOTH);
    layoutData.horizontalSpan = 2;
    layoutData.verticalSpan = 2;
    browser.setLayoutData(layoutData);
    
    //Barra de progreso
    progressBar = new ProgressBar(this, SWT.NONE);
 progressBar.setLocation(600, 5);
 progressBar.setSize(108, 23);
 
 browser.addProgressListener(new ProgressListener() {
      public void changed(ProgressEvent event) {
          if (event.total == 0)
            return;
          int ratio = event.current * 100 / event.total;
          if (progressBar != null)
            progressBar.setSelection(ratio);
          busy = event.current != event.total;
          if (!busy) {
            index = 0;
          }
        }

        public void completed(ProgressEvent event) {
          if (progressBar != null)
            progressBar.setSelection(0);
          busy = false;
          index = 0;
        }
      });
    
    browser.setUrl(urlEntorno);
 
  }
  
}

Simplemente instanciáis un composite de este tipo y ya tenéis un navegador con su barra de progreso embebido. Con el método browser.setUrl podéis poner la url que queráis cargar.

martes, 10 de enero de 2012

Referenciar librerías jar en un ejecutable .bat

Esta mañana he estado intentando crear un ejecutable .bat en windows donde ejecutaba un fichero jar. He tenido problemas a la hora de referenciar las librerías. El error que me daba era:

exception in thread main java.lang.noclassdeffounderror

Ahora os voy a explicar como lo he solucionado.