Clave de usuario: 1234
Clave interna: hola
--------------------------------
Clave almacenada: ascii 1 + ascii h, ascii 2 + ascii o etc etc...
el algoritmo desEncriptar hace exactamente lo inverso, resta el ascii
de la base al ascii de la palabra clave, para obtener la password
original.
ahora bien, en java, utilizando hibernet y el user.hbm.xml con encoding
UTF-8, no consigo levantar la clave de la base de forma correcta y que
me tire un valor coherente de un ascii en particular. Algunos los toma
bien, y otros no coinciden.
Por ejemplo:
Supongan que la palabra clave interna es de un solo caracter al igual
que el password para que sea mas facil de debuguar:
Palabra clave: j (ascii 106)
password: a (ascii 97)
El valor que guardo en la base es el ascii 203 (106 + 97)
si voy a mysql y meto a mano este valor a cierto usuario de la
siguiente forma: ALT+203 (=Ë)
Mi codigo genera el siguiente log al hacer el login desde jsp:
La user pass desde MYSQL:Ë
Password[0]:203 | CLAVE[0]:106 // metodo desEncriptar
Caracter[0]:97 // metodo
desEncriptar
La pass dentro del metodo Desencriptar:a // metodo desEncriptar
La pass desde la base MYSQL desencriptada:a
Password[0]:97 | CLAVE[0]:106 // metodo Encriptar
Caracter[0]:203 // metodo
Encriptar
La pass dentro del metodo Encriptar:Ë // metodo Encriptar
y se loguea correctamente.
Ahora el PROBLEMA. Si la password es un 1 o sea el ascci 49, realizamos
el mismo procedimiento con la misma palabra clave, voy a mysql e
inserto el valor
ALT + 155 ( ascii 49(1) + ascii 106 (j)) = ø en la columna password (
soy conciente que el simbolo que aparezca puede ser cualquier cosa, ya
que depende del editor que usemos. Por ejemplo no aparece siempre el
mismo simbolo en el eclipse que en mysql al poner el mismo ascii)
Mi codigo genera el siguiente log al hacer el login desde jsp:
La user pass desde MYSQL:ø
Password[0]:248 | CLAVE[0]:106 //ACA ESTA EL ERROR, porque 248, deberia
ser 155
Caracter[0]:142
La pass dentro del metodo Desencriptar:?
La pass desde la base MYSQL desencriptada:?
Password[0]:49 | CLAVE[0]:106
Caracter[0]:155
La pass dentro del metodo Encriptar:?
O sea, no hay problemas de lectura de ascii desde jsp por lo visto, y
el error lo encontre levantando la password de la base y haciendo este
log tipo debug. Antes no podia entender donde estaba porque comparaba
directamente con el criteria de hibernet y me volvi loco.
Alguien podria decirme porque lee ese valor java desde la base mysql?
como veran en el codigo que ahora les paso, probe las funciones de
String para generar un UTF-8 pero no doy con la tecla.
Desde ya muchas gracias.
////////////////////////////// CODIGO
//////////////////////////////////////////////////////////////////
private String desEncriptar(String pass) throws
UnsupportedEncodingException
{
String lcClaveEncriptacion = "j";
String Resultado = "";
String lcKey;
int lnAsc,caca1,caca2;
int x = 0;
lcKey = lcClaveEncriptacion;
int b = pass.length();
for (int i=0;i < b;i++)
{
lnAsc = 0 ;
caca1= (int)pass.charAt(i);
caca2= (int)lcKey.charAt(x);
lnAsc = caca1 - caca2;
System.out.print("\nPassword["+i+"]:"+caca1+" | CLAVE
+"]:"+caca2+"\nCaracter ["+i+"]:"+lnAsc);
Resultado += (char)lnAsc;
int a = lcKey.length();
if (x < a-1)
x++;
else
x=0;
}
System.out.print("\nLa pass dentro del metodo
Desencriptar:"+Resultado);
return new String(Resultado.getBytes("UTF-8"),"UTF-8");
}
---------------------------------------------------------------------------------------------------------
el encriptar suma en vez de restar....
-------------------------------------------------------------------------------------------------------
// este es de testeo, es el que levanta la clave desde mysql para ver
que esta
// haciendo con ese ascii. Obtengo el usuario con ID = 1 que es usuario
en cuestion
public void nada(String pass) throws UnsupportedEncodingException
{
Criteria criteria = this.getSession().createCriteria(User.class);
criteria.add(Restrictions.eq("userId",new Integer(1)));
User u = (User)criteria.uniqueResult();
String perez = u.getPassword();
System.out.print("\nLa user pass desde MYSQL:"+perez);
System.out.print("\nLa pass desde la base MYSQL
desencriptada:"+this.desEncriptar(perez));
}
GRACIAS nuevamente, y espero alguna pista
PD: La contraseña, en cualquier sistema, como medida de seguridad para
el sistema mismo, solo debería de existir en su forma simple en la
cabeza del usuario.
Mariano.
__________________________________________________
Preguntá. Respondé. Descubrí.
Todo lo que querías saber, y lo que ni imaginabas,
está en Yahoo! Respuestas (Beta).
¡Probalo ya!
http://www.yahoo.com.ar/respuestas