martes, 27 de enero de 2009

SAP

Es un suit de aplicaciones, creado por una empresa alemana.

viernes, 23 de enero de 2009

Mapeo objeto-relacional

Es una técnica de programación para convertir datos entre el sistema de tipos utilizado en un lenguaje de programación orientado a objetos y el utilizado en una base de datos relacional

JPA Java persistent api (JPA)

Proporciona un estándar para gestionar datos relaciones en aplicaciones J2EE o J2SE de forma que simplifique el desarrollo de la persistencia de datos.

Desde la versión ya no requiere un contenedor EJB ni un servidor J2EE.

Es una API de persistencias de POJOS.
Es una combinación de Hibernate, Toplink, JDO y versiones anteriores de EJB.El mapeo se hacen en la misma clase de la entidad a través de anotaciones.

No se requiere de XML y pueden definirse transacciones como anotación de JPA.

El objetivo que persigue el diseño de esta API es no perder las ventajas de la orientación a objetos al interactuar con una base de datos, como sí pasaba con EJB2.

Criteria

Criteria Query nos permite definir consultas con un estilo orientado a objetos, muy distinto al clásico SQL o HQ

Su código es más complicado que el de HQL ya que necesita un análisis más detallado ya que utiliza objetos.

Una de las ventajas de Criteria es que puede montar consultas dinámicas más fácil, como por ejemplo, si queremos que tenga un where con varias opciones:

Criteria criteria = session.createCriteria(Coche.class);
if (nombre != null) {
criteria.add(Restrictions.eq("color", color));
}
if (edad != null) {
criteria.add(Restrictions.eq("puertas", puertas));
}

List coches = criteria.list();

Y en HQL tendriamos que concatenar string y esto puede inducir errores:
String query = "from Coche where color like 'Rojo%' and puertas > 2;";
List coches = sess.createQuery(query).list();

miércoles, 21 de enero de 2009

MessageDigest

Proporciona la funcionalidad de un algoritmo de mensaje, como MD5 o SHA.

martes, 20 de enero de 2009

Qué es un Hash?

Hash se refiere a una función o método para generar claves o llaves que representen de manera casi unívoca a un documento, registro, archivo, etc., resumir o identificar un dato a través de la probabilidad, utilizando una función hash o algoritmo hash. Un hash es el resultado de dicha función o algoritmo.


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;
}
}