Mostrando entradas con la etiqueta java. Mostrar todas las entradas
Mostrando entradas con la etiqueta java. Mostrar todas las entradas

miércoles, 9 de abril de 2014

Hashes en Java

Para algún que otro proyecto que me he ido montando, he tenido la necesidad de sacar el hash de alguno de los objectos con los que estaba trabajando. Como de costumbre, es ese tipo de cosas que aunque en algún momento determinado ya las has hecho, siempre se te olvida cómo volverlo a hacer. Y tienes que volver a buscar. En mi caso, se trataba, precisamente, de obtener el resultado de la aplicar una función de hash determinada y recuperar el valor correspondiente, utilizando java.

Ahora que quería recopilar las cosas que había estado haciendo, me he encontrado con que no localizo alguna de éstas, y además, que lo que tengo, no es exactamente como esperaba.

Para el tema de los hashes me estoy acordando de que tengo dos opciones.

Opción "nativa"

Para esta opción tenemos que utilizar MessageDigest. En el mismo momento de instanciarla habrá que indicarle el algoritmo que queremos utilizar. Si no existiese, nos lanzaría una excepción. Un ejemplo sería este:

 String valor = "123456";  
 try{
  String hashAux = "";
  MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
  messageDigest.reset();
  messageDigest.digest(valor.getBytes("UTF-8"));
  messageDigest.update(valor.getBytes());
  byte[] digestArray = messageDigest.digest();
   
  for(byte aux : digestArray) {
   int b = aux & 0xff;
   if (Integer.toHexString(b).length() == 1)
    hashAux += "0";
   hashAux += Integer.toHexString(b);
  }
  
  String result = new String(digestArray);
  System.out.println("hashAux: "+hashAux);
 }catch(Exception e){
  System.out.println("E: "+e);
 }

Como resultado obtendremos:



8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

y se puede verificar que es correcto al compararlo en un algún sitio por Internet.

Además, hay que tener en cuenta los distintos algoritmos que pueda permitir. Al menos no parece trivial encontrarlo. En alguno de los sitios donde he ido a buscar (porque, recuerdo, que hacía tiempo que no tenía que trabajar sobre esto, y lo de hardcodear los valores no me hacía ninguna gracia), he visto una lista parecida a esta:

  • MD2
  • MD5
  • SHA-256
  • SHA-384
  • SHA-512
  • SHA, SHA-1, SHA1
En la que voy a considerar los últimos elementos como que hacen el mismo algoritmo. ¡Ojo! Que según qué equipo podría fallar. 

Los resultados también podrían cambiar si estamos trabajando con codificaciones diferentes. En mi caso, he definido la que venía en el ejemplo. 

Opción "apache commons"

La otra opción es utilizar la librería de apache commons. Nos ofrecerá el método DigestUtils, el cual, al mismo tiempo, nada más instanciarlo tendremos que indicarle qué hash utilizar. 

 String hashAux2 = null;
 String hashAux3 = "";
 byte[] hashAux3byte = null;
 try{
  hashAux2 = DigestUtils.sha256Hex(valor); 
  hashAux3byte = DigestUtils.sha256(valor);
  for(byte aux : hashAux3byte) {
   int b = aux & 0xff;
   if (Integer.toHexString(b).length() == 1)
    hashAux3 += "0";
   hashAux3 += Integer.toHexString(b);
  }
     System.out.println("hashAux2: "+hashAux2);
     System.out.println("hashAux3: "+hashAux3);
     
 }catch(Exception e){
  System.out.println("Exception hash: "+e.getMessage());
 }

Como podréis comprobar, tenemos la opción de que nos pase directamente la cadena convertida en formato hexadecimal, y así no tendremos que hacer la chapuza de iterar sobre cada una de las posiciones del array que nos devuelva. Tambien DigestUtils nos ofrece directamente los algoritmos con los que nos permitirá trabajar.

A la hora de ejecutar este último ejemplo podremos ver que, en efecto, el resultado es el mismo que en el primero.

Esta última opción creo que es la mejor, aún dependiendo de una librería que se tenga que importar y que no venga directamente en la paquetería de java.

Espero que esto os sea de utilidad. Por mi parte, me vendrá muy bien tenerlo a mano para cuando se me vuelva a olvidar cómo lo hice. 

lunes, 22 de julio de 2013

Ingeniería social en coderanch

A veces, cuando estás codificando algún programa, te encuentras con que tienes problemas en cómo puedes hacer alguna de las tareas necesarias. Por lo tanto, no queda otra opción que hacer una búsqueda y ver si alguien ha tenido la feliz idea y lo ha explicado o si ha tenido que ir en busca de la respuesta y la tenemos en algún foro.

En estas me encontré hace poco. Por lo que me dispuse a buscar la respuesta y en un foro bastante conocido (o, al menos, que me he encontrado muchas veces), me encontré con algo parecido a esto:

Foro en coderanch
Foro en coderanch
Si resulta que las respuestas que dan no son válidas para lo que necesitas y además te encuentras un "mensaje" que dice que "está de acuerdo, pero que tiene un enlace que le ha ahorrado mucho tiempo", ¿qué haces? Vas y lo visitas. Y, para colmo de los colmos, te encuentras con que no es lo que buscabas. Te acuerdas de la familia del que lo ha puesto hasta que lo miras fijamente y descubres que no es un mensaje. Es un $*#!= anuncio que te lo han colado. 

La verdad, es algo que tendría que haberme dado cuenta. Pero  bueno. Al menos se quedó en eso. No fuera a ser que me hubieran colado algo más. 

lunes, 27 de mayo de 2013

Android: R cannot be resolved to a variable

Desde ayer sábado, y ahora mismo, estoy teniendo un problema con el entorno de desarrollo de Android en Eclipse. Me está dando un error muy curioso en el que me indican que

R cannot be resolved to a variable

Para explicarlo de forma rápida, R es un objeto que se genera a partir de los recursos que vamos creando en una carpeta interna cuyo nombre es res (procedente de resources). En esa carpeta hay una serie de subcarpetas con sus nombres predefinidos donde se introducen ficheros xml, imagenes, música. Dependiendo de su tipo, se podrá acceder a ellos por el nombre R.tipoDeRecurso.nombreQueLeHemosPuesto.

En fin. La historia es que R debería de existir siempre. Pero, por desgracia, parece ser que a veces se producen una serie de problemas que harán que éste no se vaya regenerando (o que se pierda) y, por lo tanto, nos dará el error que tenemos en el título de este post.

He estado haciendo una serie de búsquedas y estos son los consejos que van dando para solucionarlo. A unos les funciona, a otros (como ahora mismo a mí) no. Recomiendo leer todo hasta el final y después ponerse a probar, no vaya a ser que os llevéis alguna sorpresa. 

  • Hacer un clean y un rebuild del proyecto. Incluso, recomiendan que antes de hacerlo, quitar la opción de build automatically. Todo ello desde el menú proyect.
  • Hacer la primera opción y después, reiniciar el Eclipse. 
  • Verificar los recursos:
    • Los nombres de los recursos tienen que estar siempre en minúsculas. El consejo que dan es que si quieres alguna diferenciación, en vez de utilizar formatoCamello.xml (que estaría mal) utilices formato_no_camello.xml. 
    • No sólo es el nombre del continente el que pueda estar mal, sino también su contenido. Si hay algo mal diseñado, por ejemplo, en algún fichero xml, también podrá dar ese error. Podría ser que, por poner un ejemplo, se esté referenciando en un recurso existente a otro inexistente (por poner un ejemplo: un listado [array], una cadena string [que permitiría hacer internacionalización], etc, etc).
      • Recordar que según para la versión de API (versión mínima para la que se esté programando la aplicaicón), en el layout habrá que ver si estamos utilizando un fill_parent o un match_parent.
  • Parece ser que también podría ser algún tipo de error en la sincronización con el workspace o si se está haciendo un rebuild del mismo. Dicen que podría ser por tener un equipo algo lento. 
  • El hecho de estar importando en tus clases java com.nuestroproyecto.R. Y, aún así, cuando lo hago, me da una alerta (y en vez de no encontrar R, no me encuentra los recursos). Esto te podría pasar, por ejemplo, si utilizas Ctrl+Shift+O para que te importe directamente los paquetes necesarios y te los deje bien ordenados.
  • El fichero AndroidManifest.xml es un fichero base para la aplicación. En él se indican cosas tan importantes como las clases que podrán mostrar las pantallas (clases que heredan de Activity o sus herederos), el estilo de toda la aplicación, etc. Si has reutilizado alguno, ahí tienes el problema. Entre otras cosas, verifica que el paquete en el que debería de encontrar tus Activities es correcto.
  • Botón derecho sobre la carpeta del proyecto, ir a Android tools y después a Fix proyect properties. También míralo si por algún casual has cambiado el nombre del paquete. 
  • En las propiedades del proyecto, ir a java build path y mirar si la librería de Android numversion está con el tick. Hasta ahora no lo estaba, y lo he intentado, pero nada. Aún así, al reparar las propiedades del proyecto, parece que me lo han desmarcado. De todas formas, alguien ha dicho que se le solucionó así. En la pestaña Order and Export tendrían que aparecer tanto la carpeta NombreProyecto/src como NombreProyecto/res.
  • Comprobar si tu sistema operativo es 64 bits y el entorno de desarrollo que usa las librerías y paquetes de Android son para 32 bits. Ya sea el ADT, el jdk... No debería de ser el problema si antes te funcionaba. 
  • Vete a Android SDK Manager, desde el menú Window. Actualiza las cosas que te diga. Entre otras cosas, instala el SDK platform
  • Hay un error que no acabo de entender. Lo llama hierarchical parent error: viene a decir que, si por algún casual debajo de la carpeta gen tienes un R.java, lo elimines. Evidentemente, después tendrás que volver a hacer un clean y, si es que no se hace automáticamente, un rebuild. Yo recomiendo que en este caso no se haga automáticamente. En mi caso, no es posible eliminarlo porque no existe/ha desaparecido. 
  • Hay un ejemplo que ponen en el que la ruta al sdk tiene que terminar en "/" (barra). Es un ejemplo con rutas en Linux. 
  • Copipasteando: "I got this error after i have typied & symbol in string.xml file". 
  • Otro posible error es haber puesto un .js en una carpeta que no sea assets.
  • Eliminar la carpeta /res/raw con todo su contenido, volver a crearla y volver a hacer el proceso clean/rebuild.
  • Actualizar los plugins de Eclipse: Menú Help --> Check for updates. Aunque no sea esto, nunca está de más actualizarlos. ¿No?
  • Otra, que se me estaba ocurriendo mientras que estaba escribiendo estas líneas: reiniciar el ordenador. No es normal que si creas un proyecto totalmente nuevo, te de estos errores. 
  • Si reiniciando veis que sigue dando ese error, podéis volver a probar lo anterior. Por ejemplo, una vez reiniciado, si haciendo limpieza y volviendo a reconstruir no funciona, ni siquiera dándole a la opción del fix con desde las herramientas de Android, puedes ir a sus propiedades, y en el build path mirar si la versión está seleccionada o no (tal y como expliqué más arriba. Es más, recomiendo mirar una vez más las actualizaciones. Si has tenido que actualizar, una vez reiniciado el Eclipse, podrás hacer el clean & build.
En mi caso, he hecho un montón de todas estas cosas, pasando por el clean, rebuild, cerrar y abrir el Eclipse, actualizar todo lo actualizable, reiniciar el equipo, volver al clean, build, ir al java build path... Unas cuantas horas para conseguir solucionar todo esto, y, de paso, de vuelta al proyecto original, que me dejase arreglar cosas que antes no me decía que estuviesen mal. 

Total, que si te da ese problema, estas son muchas de las razones por las que te puede estar dando la brasa y no te deje trabajar. Eso si, si sabéis de alguna otra no enumerada aquí, por favor, ponedla en los comentarios. 

Algunas fuentes de donde he podido obtener esta información:
  • StackOverflow: Algunos de los enlaces aquí referenciados están indicados en las primeras respuestas. De hecho, dos de ellos ya los había encontrado antes de ver esta pregunta.
  • StackOverflow: Bastantes ejemplos/posibles soluciones. Me ha gustado mucho por eso. 
  • StackOverflow: Actualiza el SDK platform, hierarchical parten error,  carácter especial en el strings.xml...
  • Ejemplo, con captura incluida, de los nombres en mayúsculas. Otra solución al otro posible problema:  main cannot be resolved or is not a field. Sustituye main por el nombre del recurso.
  • StackOverflow: Más ejemplos (por ejemplo, las carpetas de Order and Export). $%!¿¡¿?!!. Acabo de perder el enlace a este post.

miércoles, 29 de agosto de 2012

Explotando JAVA 1.7

Ayer ¿o era antes de ayer? saltaba la noticia de una gran vulnerabilidad en java.  A partir de ésta se podría conseguir desactivar el control que hace java sobre la ejecución de las aplicaciones desarrolladas en este lenguaje.

Una explicación de cómo podría actuar lo hacen en Hispasec:

Algunos apuntes curiosos sobre el 0-day de Java 7

El preocuparse no es para menos.  ¿Una ejecución con privilegios?

También tenemos otra reseña en Security by Default:

Grave vulnerabilidad en Java RE 1.7: Cómo deshabilitar Java en todos los navegadores

Si bien en Hispasec comentaban que podría estar preparado para ejecución en distintos sistemas operativos,  sólo lo está haciendo en Windows.  Pero,  también nos dicen en SbD y en F–Security (¿se llama así?)  que herramientas como Metasploit o Blackhole ya tienen sus actuaciones para aprovechar la vulnerabilidad y,  como no está planeado que actualicen java hasta, más o menos,  dentro de un mes...

Total.  Que a día de hoy se recomienda encarecidamente desactivar java.