clave encriptada - problema con ascii

593 views
Skip to first unread message

elguillote

unread,
Jul 31, 2006, 12:54:07 PM7/31/06
to JavaSOS
Hola que tal gente. Soy un novato en java y queria hacerles una
pregunta.
Me estoy volviendo loco con la lectura de una clave encriptada en
MYSQL. La tabla user, cuyo charset es UTF-8 y el collation
utf8_spanish_ci tiene una columna password que guarda una clave
encriptada con un algoritmo sencillo ( Encriptar )que suma los ascii de
una clave interna de mi sistema a la clave del usuario. Por ejemplo:

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

elguillote

unread,
Aug 2, 2006, 1:16:31 PM8/2/06
to JavaSOS
nadie muchachos me puede ayudar? por ahi no se entendio nada de lo que
puse. En realidad agradeceria su ayuda. El problema es leer desde la
base de datos mysql un string, y usar los ascii para poder
desencriptar. Hay alguna funcion que se use para esto? directamente un
casting de int al char? esto por lo visto no funciona porque no es lo
mismo ALT+203 que ALT+0203 y al hacer el casting el cero a la izq
obviamente desaparece, por lo que no me sirve

GRACIAS nuevamente, y espero alguna pista

Fernando Cheros

unread,
Aug 2, 2006, 9:13:21 PM8/2/06
to jav...@googlegroups.com
Mira... yo te voy a ayudar pero te voy a comentar un par de cosas antes.
Crear una rutina propia de codificación de claves no solamente es poco
realista, poco efectivo, sino que es muy inseguro, sobretodo si utilizas
codificaciones de ida y vuelta cosa que no debería de existir. Se deben
utilizar hash para guardar contraseñas en bases de datos y las rutinas
para hacer esto las encuentras en la propia base de datos o en Java si
quieres delegarlo al sistema. (SHA por ejemplo)
La mayoría de la gente se cree que el administrador de un sistema
debería de poder decodificar las contraseñas para acceder como el
usuario, para hacer pruebas y cosas asi de tontas (me ha sucedido en
varias empresas) y esto es un error no solamente por aspectos de
seguridad, también es un error de diseño del sistema ya que las
contraseñas no se deberían de poder decodificar, ni se deberían de hacer
pruebas con un usuario normal, se deberían de utilizar usuarios de
prueba en producción en el peor de los casos.
El otro error (y es enorme) es explicar tu rutina de codificación en una
lista pública con tu nombre. Una persona con medio dedo de frente un un
par de horas te quiebra tu sistema de codificación sin importar que
palabra uses por lo cual toda tu rutina ya es inútil.
Si luego de todo esto quieres continuar con tu rutina de codificación te
diría que utilizaras binary como tipo en la base de datos y byte como
tipo en Java, no solamente estoy seguro que soluciona tu problema sino
que seguramente sea mas transparente y quede mas claro.

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.


--
http://www.java.cabezudo.net

Jorge Guerrero

unread,
Aug 2, 2006, 5:01:40 PM8/2/06
to jav...@googlegroups.com
No se realmente cual será el problema,
pero algo que podrías probar es que en vez de desencriptar la clave que obtienes desde mysql, encriptes la clave que ingresa el usuario y luego la compares con el criteria.
Creo que de esa forma te puede resultar más fácil, y solo necesitas el código de encriptación.

Saludos



2006/8/2, elguillote <stsa...@gmail.com>:



--
Jorge Guerrero Damián

Mariano Rabioglio

unread,
Aug 4, 2006, 11:17:45 AM8/4/06
to jav...@googlegroups.com
Hola a todos. Estoy trabajando sobre una aplicacion, la cual tiene que
conectarse a un servidor, mantener esa conexion a traves de mensajes de eco,
y a traves de ese socket, enviar pedidos y recibir respuestas (siempre
manteniendo la misma conexion). Yo hasta ahora siempre trabaje con
aplicaciones en las cuales se usaban varias conexiones (1 por cada pedido
por parte del cliente). Por favor, si alguien ya conoce sobre este tema,
agradecere la ayuda.
Saludos a todos.

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


Reply all
Reply to author
Forward
0 new messages