jump to navigation

…Y tambien encriptame marzo 7, 2007

Posted by superpiwi in Java.
trackback

En el post anterior comentaba como convertir a una cadena de texto nuestros objetos. ¿Porque no encriptarlos tambien?.Para ello, emplearemos un API de encriptacion muy sencillo de utilizar.

se llama Java Simplified Encryption

He escrito la siguiente clase, aunque realmente lo que hace es llamar a la clase TextEncryptor del API.


/**
* Encriptar.java
*
* Utilidad para codificar y decodificar textos mediante una palabra clave
*
* @author jdelgado
* @version 0.0.0.1 - 6 de Marzo 2007
*
* usa Java Simplified Encryption (http://www.jasypt.org/getting-started-easy.html)
*
*/
package comun.util.tools;
import org.jasypt.util.TextEncryptor;
public class Encriptar
{
/**
* Codifica un texto mediante una palabra clave
* @param mensaje el texto a codificar
* @param password la palabra clave
* @return el texto codificado
* @throws Exception excepcion levantada en caso de error
*/
static public String codifica(String mensaje,String password) throws Exception
{
try
{
TextEncryptor textEncryptor = new TextEncryptor();
textEncryptor.setPassword(password);
String encryptedText = textEncryptor.encrypt(mensaje);
//String plainText = textEncryptor.decrypt(myEncryptedText);
return encryptedText;
}
catch(Exception e)
{
throw e;
}
}
//----
/**
* Decodifica un texto mediante una palabra clave
* @param mensaje el texto a decodificar
* @param password la palabra clave
* @return el texto decodificado
* @throws Exception excepcion levantada en caso de error
*/
static public String decodifica(String mensaje,String password) throws Exception
{
try
{
TextEncryptor textEncryptor = new TextEncryptor();
textEncryptor.setPassword(password);
String Text = textEncryptor.decrypt(mensaje);
return Text;
}
catch(Exception e)
{
throw e;
}
}
//----
/**
* Para probar el correcto funcionamiento de la clase de ejemplo.
* @param args argumentos de entrada.
*/
public static void main(String[] args) {
try
{
String mensaje="Un Ubuntu para atraerlos a todos y atarlos en las tinieblas.";
String codigo_secreto="best";
System.out.println("Texto original: "+mensaje);
String cod = Encriptar.codifica(mensaje, codigo_secreto);
System.out.println("Texto encriptado: "+cod);
String texto_bien = Encriptar.decodifica(cod, codigo_secreto);
System.out.println("Texto desencriptado : "+texto_bien);
String texto_mal = Encriptar.decodifica(cod, "badpassword");
System.out.println("Texto desencriptado (bad password): "+texto_mal);
}
catch(Exception e)
{
e.printStackTrace();
}
}
//----
}
//end of class Encriptar.java

Como ejemplo codificamos el siguiente texto:


Un Ubuntu para atraerlos a todos y atarlos en las tinieblas.

Cuando ejecutamos el metodo de encriptacion con la password “best” obtenemos:


ppAz72th0T2W/ivcCpYEieRUdZ0LwQ+n39DpS5giD+9hX2owZgTKN30uoEqZujtXQBMtxNmXJAMe5HSNXNRtZ7j0YSqUOb6E

Si este texto lo desencriptamos con la password correcta, obtendremos el texto original. En caso contrario nos saltara una excepcion:


org.jasypt.exceptions.EncryptionOperationNotPossibleException

Echale un vistazo al API, tiene muchas mas posibilidades.

Comentarios»

1. dfernandez - marzo 7, 2007

Hola, soy el autor de jasypt🙂. Muchas gracias por probar la librería, no dudéis (tú o tus lectores) hacer cualquier comentario o sugerencia sobre ella. Para ello tenéis disponibles los trackers y foros de jasypt en http://www.jasypt.org

2. superpiwi - marzo 7, 2007

Gracias a ti. Estupendo trabajo. Muy útil.

3. Marcos - abril 11, 2007

¿Que pasa si quiero desencriptar la cadena desde otra clase o aplicación?

4. superpiwi - abril 12, 2007

Pues que lo desencriptas. Tu le pasas la cadena cifrada y la clave, si la clave es correcta, lo ves como deberia ser, en otro caso te dara error. Mirate el API, hay muchos mas mecanismos de encriptacion, el que comento en el ejemplo es el mas simple y sencillo.

5. serpini - abril 16, 2007

Hola, ¿como puedo agregar el .jar de jasypt en mi proyecto de eclipse?, que me gustaria utilizar esta libreria y tus ejemplos de encriptar y desencriptar.

6. superpiwi - abril 17, 2007

Tienes que seleccionar tu Proyecto (por ejemplo en la vista de navegador (Navigator) lo seleccionas y haces click derecho sobre el, te aparecera un menu emergente donde seleccionas propiedades, Esto mismo tambien lo puedes hacer desde el menu de Eclipse desde Proyecto > Propiedades (Project > Properties) ). Te aparecera una ventana nueva. Pues bien en el lateral izquierdo hay varias opciones. marcas la opcion “Java Build Path” y de la lista de pestañas que entonces te aparece marcas la de “Libraries”. Es aqui donde puedes añadir nuevos “.JAR” a tu proyecto que se añadiran al CLASSPATH. Asi que añadiendo esos .jar que te hacen falta ya se quita en el codigo los errores de que no encuentran tal o tal clase.

7. serpini - abril 17, 2007

muchas gracias

8. Maxi - junio 21, 2007

Hola, yo tengo un proyecto java (no web). Agregue el .jar a las librerias y genere la clase Encriptar.java. pero cuando lo corro me devuelve:
Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at org.jasypt.util.text.BasicTextEncryptor.(BasicTextEncryptor.java:67)
at misc.Encriptar.codifica(Encriptar.java:28)
at misc.Encriptar.main(Encriptar.java:72)
Java Result: 1

Alguien sabe por que?

9. superpiwi - junio 21, 2007

Te falta el jar de apache.commons, es lo que te dice aqui:

Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException

No encuentra la clase: org.apache.commons.lang.exception.NestableRuntimeException

Asegurate de añadir el apache commons a tu classpath.

10. Julieta - junio 26, 2007

Primero muchas gracias por compartir tu tiempo y conocimiento.
Mi duda es la siguiente, me marca el mismo error, estoy usando eclipse, pero como servidor tengo el weblogic, no afecta en anda si agrego el apache commons?

Gracias de antemano

11. superpiwi - junio 27, 2007

Si creo saber lo que te pasa. Si en Eclipse te funciona es porque te encuentra el .jar en tu CLASSPATH de Eclipse. pero si al desplegar la aplicacion en el servidor te da el error de clase no encontrada es porque seguramente necesitas añadir el .jar a tu CLASSPATH del SERVIDOR. Aqui ten cuidado, si estas en Windows el serarador es punto y coma ; si tu servidor esta en Solaris u otro Unix o Linux, el separador es dos puntos :

CLASSPATH:ruta_jar/jar1:ruta_jar2/jar2:etc…

Lo que ya no te puedo decir ahora es donde esta ese CLASSPATH en Weblogic. deber ser un XML o fichero de texto, o lo puedes cambiar con la utilidad de administracion. Yo lo tocaba hace 7 años, y entonces era un txt. me imagino que habra cambiado bastante la cosa. Espero q te pueda servir.

Saludos.

12. Lorena - agosto 13, 2007

Quisira saber como puedo desencriptar una clase del java.

esta tiene extenxion .class, y lo quiero desencriptar para poder ver el codigo fuente.

Gracias

13. superpiwi - agosto 16, 2007

Lo que tu quieres es “descompilar” el .class. Eso a veces si no esta ofuscado resulta, otras veces si el .class esta ofuscado es casi imposible saber cual era el codigo original.
De todas formas puedes intentarlo. te recomiendo que uses una herramienta como “jad” o “java decompiler”. te las instalas y son muy sencillitas de usar.
Generalmente con un “jad fichero.class” ya te devuelven un fichero con extension .jad que viene a ser el .java que estas buscando.

http://www.kpdus.com/jad.html

14. Iliana - noviembre 8, 2007

Hola, se me hace muy practico el ejemplo que estan manejando, pero bien de que pagina puedo descargar el archivo .jar, ya que descarge una al dar click en la liga pero los archivos .java no se encuentran, solo los class, y no creo que vaya a funcionar mi proyecto asi, (lo estoy desarrollando con NetBeans)

15. superpiwi - noviembre 13, 2007

Hola Iliana,
desde:
http://www.jasypt.org/download.html
te bajar el fichero que contiene el .jar que te hace falta. Ahora no recuerdo el nombre, debe ser algo como jasypt.jar.
Ese fichero, aunque contenga solo .class no importa. no necesitas los fuentes .java de esas clases. el .jar tal cual lo añades al CLASSPATH de tu proyecto. pues cuando escribas tu propio codigo y hagas un:

import org.jasypt.util.TextEncryptor;

te buscara esa clase dentro del .jar.
y poco mas…

Es añadir el .jar a tu classpath, y escribir una clase nueva que encripte un texto, por ejemplo la que he puesto:

TextEncryptor textEncryptor = new TextEncryptor();
textEncryptor.setPassword(“mi_password”);
String Text = textEncryptor.decrypt(“Hola hola caracola”);
System.out.println(“Texto encriptado:”+Text);

16. Sandra - noviembre 22, 2007

Hola

Quiero saber como puedo hacer que a partir de mis .class ninguna herramienta de decompilar los .class obtenga el código fuente original.

Otra pregunta, con el jasypt puede encriptar los datos que se envían por mi URL en una página Web y desencriptarlos cuando lleguen al servidor para procesarlos?

Gracias.

Espero que me puedan ayudar.

17. superpiwi - noviembre 27, 2007

lo que buscas es un ofuscador de codigo.
si pones:

java obfuscator

en el google, te van a salir unos cuantos.

Respecto a lo de encriptar y desencriptar si que puedes hacerlo, podrias p.ej enviar el texto encriptado y luego en el destino desencriptarlo. Aunque para eso mejor usar https (que ya se encarga el protocolo de cifrar la comunicacion).

18. Maikel - diciembre 1, 2007

Hola,

ya hace una semana que estoy peleando con el tema y buscando por la red me he encontrado este blog y he visto que aparece el mismo problema que tengo!
Mi problema es el siguiente(copio y pego a continuación porque ha sido explicado más arriba):

************** ***************************
8. Maxi – Junio 21, 2007

Hola, yo tengo un proyecto java (no web). Agregue el .jar a las librerias y genere la clase Encriptar.java. pero cuando lo corro me devuelve:
Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at org.jasypt.util.text.BasicTextEncryptor.(BasicTextEncryptor.java:67)
at misc.Encriptar.codifica(Encriptar.java:28)
at misc.Encriptar.main(Encriptar.java:72)
Java Result: 1

Alguien sabe por que?
************** *****************************

Superpiwi, me he descargado y añadido al Classpath de mi proyecto Eclipse los JARs que aparecen citados en “Jasypt-dependencies”; tb he probado de añadir a la vble CLASSPATH (en entorno Windows) la ruta donde se encuentran la carpeta “lib” de mi proyecto…pero tampoco funciona.
No hay manera de que la MV encuentre la clase “commons/lang/NestableRuntimeException”

Como podría depurar mi error?? Se te ocurre algo?? Necesitas más información??
Gracias de antemano.

19. auro - julio 11, 2008

hola Superpiwi quiero pedirte de favor que me ayudes con un problema que tengo, estoy instalando informix v10.0 en fedora 8 con escritorio gnome, pero al momento de ejecutar ./installserver me sale el siguiente error
Exception in thread “main” java.lang.NoClassDefFoundError: run
Caused by: java.lang.ClassNotFoundException: run
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

he instalado el jdk1.6.0_07 que trae el JRE incluido mi archivo de ejecución (java.sh) contiene

PATH=$PATH:JAVA_HOME/bin
JAVA_HOME=/usr/java/jdk1.6.0_07
export JAVA_HOME PATH

¿a casohay algo que me falte definir? si es el CLASSPATH ¿cómo se cual ruta poner para que encuentre las clases?

20. Julio Oliveira - Buenos Aires - julio 25, 2008

Gente

Falta la libreria “icu4j-3.4.4.jar”

Ejemplo simple encriptado password:

/**
* Para probar el correcto funcionamiento de la clase de ejemplo.
* @param args argumentos de entrada.
*/
public static void main(String[] args) {
try
{
String inputPassword = “julio”;

String inputPassword2 = “julio2”;

BasicPasswordEncryptor passwordEncryptor = new BasicPasswordEncryptor();
//passwordEncryptor.

String encryptedPassword = passwordEncryptor.encryptPassword(inputPassword);
System.err.println(“Encriptado :” + encryptedPassword);

String encryptedPassword2 = passwordEncryptor.encryptPassword(inputPassword);
System.err.println(“Encriptado 2 :” + encryptedPassword2);

String encryptedPassword3 = passwordEncryptor.encryptPassword(inputPassword2);
System.err.println(“Encriptado 3 :” + encryptedPassword3);

String encryptedPassword4 = passwordEncryptor.encryptPassword(inputPassword2);
System.err.println(“Encriptado 4 :” + encryptedPassword4);

String encryptedPassword5 = passwordEncryptor.encryptPassword(inputPassword2);
System.err.println(“Encriptado 5 :” + encryptedPassword5);

if (passwordEncryptor.checkPassword(inputPassword, encryptedPassword)) {
System.err.println(“1 Correcto”);
} else {
System.err.println(“1 Error “);
}

if (passwordEncryptor.checkPassword(inputPassword2, encryptedPassword2)) {
System.err.println(“2 Correcto”);
} else {
System.err.println(“2 Error “);
}

if (passwordEncryptor.checkPassword(inputPassword2, encryptedPassword3)) {
System.err.println(“3 Correcto”);
} else {
System.err.println(“3 Error “);
}

if (passwordEncryptor.checkPassword(inputPassword2, encryptedPassword4)) {
System.err.println(“4 Correcto”);
} else {
System.err.println(“4 Error “);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
//—-
}
//end of class Encriptar.java

21. auro - julio 28, 2008

Hola julio, gracias por tomarte la molestia de responder a mi pregunta, pero ya he solucionado el problema.
La cuestión era que yo habia movido el ./installserver de su carpeta de origen por eso no encontraba las clases, creo que ese fue el problema, porque el java me estaba funcionando bien, solo cambie el installserver a su carpeta original y ya se pudo ejecutar.
Gracias.
BYE, salu2

22. newbie - julio 30, 2008

Hola a todos…probe la libreria y los metodos descritos lineas arriba y el eclipse lo reconoce.. pero a la hora de ejecutarlo me sale el siguiente mensaje de error..

javax.servlet.ServletException: org.apache.commons.lang.exception.NestableRuntimeException: java.lang.NoClassDefFoundError: com/ibm/icu/text/Normalizer
org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:535)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:433)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

causa raíz

org.apache.commons.lang.exception.NestableRuntimeException: java.lang.NoClassDefFoundError: com/ibm/icu/text/Normalizer
aprendiendo.daos.SqlUsuarioDAO.insertarUsuarios(SqlUsuarioDAO.java:93)
sprendiendo.services.UsuarioService.registrarUsuario(UsuarioService.java:20)
aprendiendo.struts.action.ActionUsuario.insertar(ActionUsuario.java:59)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

causa raíz

org.jasypt.exceptions.EncryptionInitializationException: java.lang.NoClassDefFoundError: com/ibm/icu/text/Normalizer
org.jasypt.encryption.pbe.StandardPBEByteEncryptor.initialize(StandardPBEByteEncryptor.java:597)
org.jasypt.encryption.pbe.StandardPBEStringEncryptor.initialize(StandardPBEStringEncryptor.java:488)
org.jasypt.encryption.pbe.StandardPBEStringEncryptor.encrypt(StandardPBEStringEncryptor.java:541)
org.jasypt.util.text.StrongTextEncryptor.encrypt(StrongTextEncryptor.java:95)
sprendiendo.services.Encriptar.codifica(Encriptar.java:17)
aprendiendo.daos.SqlUsuarioDAO.insertarUsuarios(SqlUsuarioDAO.java:81)
sprendiendo.services.UsuarioService.registrarUsuario(UsuarioService.java:20)
aprendiendo.struts.action.ActionUsuario.insertar(ActionUsuario.java:59)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

causa raíz

tal vez estoy agregando mal la librerias externas(estoy agregando los 6 .JAR q vienen en la carpeta de JASYPT)..

alguien podria ayudarme detalladamente porfavor…

muchas gracias de antemano…🙂

23. Jose Ayerdis - julio 30, 2008

Encriptar?? Seria mejor que usaras Cifrar, aqui hablo por que

http://blognecronet.blogspot.com

Excelente post de cifrado en Java te felicito.

24. Ger - octubre 3, 2008

Hola tengo el mismo problema, como pongo bien lo de classpath uso tomcat

java.lang.NoClassDefFoundError: org/apache/commons/lang/exception

/NestableRuntimeException

java.lang.ClassLoader.defineClass1(Native Method)

java.lang.ClassLoader.defineClass(ClassLoader.java:620)

java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)

java.net.URLClassLoader.defineClass(URLClassLoader.java:260)

java.net.URLClassLoader.access$100(URLClassLoader.java:56)

java.net.URLClassLoader$1.run(URLClassLoader.java:195)

java.security.AccessController.doPrivileged(Native Method)

java.net.URLClassLoader.findClass(URLClassLoader.java:188)

java.lang.ClassLoader.loadClass(ClassLoader.java:306)

java.lang.ClassLoader.loadClass(ClassLoader.java:251)

java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

mypackage.servlets.miServlet.procesarPeticion(miServlet.java:32)

mypackage.servlets.miServlet.doPost(miServlet.java:63)

javax.servlet.http.HttpServlet.service(HttpServlet.java:710)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

25. ghi - octubre 7, 2008

Y como encriptar y desencriptar un archivo? Puedes poner un ejemplo?

26. superpiwi - octubre 14, 2008

¿Archivos de texto?.
Pues es simple, lees el contenido del archivo a un string, y le aplicas la misma funcion.

27. AlitoXxX - octubre 16, 2008

Gente, a los que les salta la excepción de clase no encontrada, es porque no importaron TODOS los jars que vienen en el rar que bajaron desde la página. Renegando un rato me dí cuenta de que el classpath de la API son 2 jars, y no sólo uno: El primero se encuentra en la carpeta dist, y hay un segundo jar en la carpeta bin. Los fuentes y el javadoc están en la carpeta dist, pero tuve que descomprimir los javadocs para que funcionaran con NetBeans 6.1.
Con eso me funciona a la perfección.
Mcuhas gracias por los ejemplos Superpiwi y al creador de la librería, me ahorraron horas de código criptográfico…


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: