Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas

jueves, 11 de julio de 2013

Funciones de Resumen MD5 y SHA en JAVA [aplicado a archivos]


El la publicación anterior compartí el código java para generar funciones hash a una cadena  utilizando los algoritmos MD2, MD5, SHA-1,SHA-256,SHA-384,SHA-256.

Si deseas puedes consultar  el post Funciones de Resumen MD5 y SHA en JAVA en el cual explico brevemente las funciones hash.

Para realizar las capturas de pantalla utilizo la aplicación publicada aquí: Aplicacion Java para realizar capturas de pantalla.


El código para obtener la cadena hash de un archivo es el siguiente:

import java.io.*;
import javax.crypto.*;
import javax.crypto.spec.DESKeySpec;
import java.security.*;
import java.util.*;
/*Aplicacion para generar resumenes hash de un archivo
 * @marxs7 Less is better
 * http://marxs7.blogspot.com
 */
public class HashArchivo
{
    private static String hash;
   public static String generaHash(String rutaArchivo,String algoritmo)
   {
   
    //declarar funcion de resumen
      try{
      MessageDigest messageDigest = MessageDigest.getInstance(algoritmo); // Inicializa con algoritmo seleccionado
     
      //leer fichero byte a byte 
         try{
            InputStream archivo = new FileInputStream( rutaArchivo );
            byte[] buffer = new byte[1];
            int fin_archivo = -1;
            int caracter;
       
            caracter = archivo.read(buffer);
       
            while( caracter != fin_archivo ) {
         
               messageDigest.update(buffer); // Pasa texto claro a la función resumen
               caracter = archivo.read(buffer);
            }   
       
            archivo.close();//cerramos el archivo
            byte[] resumen = messageDigest.digest(); // Genera el resumen 
            
            //Pasar los resumenes a hexadecimal
            hash = "";
            for (int i = 0; i < resumen.length; i++)
            {
               hash += Integer.toHexString((resumen[i] >> 4) & 0xf);
               hash += Integer.toHexString(resumen[i] & 0xf);
            }
          //  System.out.println("Resumen "+algoritmo+" " + hash);
         }
         //lectura de los datos del fichero
         catch(java.io.FileNotFoundException fnfe) {
         //manejar excepcion archivo no encontrado
         }
         catch(java.io.IOException ioe) {
         //manejar excepcion archivo
         }
      
      }   
      //declarar funciones resumen
      catch(java.security.NoSuchAlgorithmException nsae) {
      //manejar excepcion algorito seleccionado erroneo
      }
        return hash;//regresamos el resumen
      
   }

}


A partir de este código podemos generar una interfaz gráfica que nos permita fácilmente  obtener el valor MD5 o SHA de un archivo en formato hexadecimal.

En mi caso la interfaz es la siguiente.




Descarga











martes, 11 de junio de 2013

Aplicación Java para realizar Capturas de Pantalla


El día de hoy se me ocurrió realizar una aplicación que realizara capturas de pantalla, o impresiones de pantalla y que las exportara a un archivo de imagen jpg, png, gif, bmp, etc

Investigando un poco encontré información acerca de la clase Robot y entre otras cosas  la clase nos permite realizar capturas de nuestra pantalla con gran nitidez(también depende del tipo de imagen generado).



No me extenderé tratando de explicar cada formato de imagen porque no es el objetivo de mi publicación. Pueden jugar con el código y experimentar, para así sacar sus propias conclusiones.

Este es el ejemplo más sencillo para hacer una captura de la pantalla completa.

import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;

class CapturarPantalla {
  public static void main(String args[])
        throws AWTException, IOException {
     // captura la pantalla completa
     BufferedImage pantalla = new Robot().createScreenCapture(
     new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) );//se obtiene el tamaño de la pantalla
     
     // Lo guarda como un png, podemos modificarlo y guardarlo como jpg,gif,bmp
     File file = new File("pantalla.png");//creamos el archivo
     ImageIO.write(pantalla, "png", file);//escribimos la imagen en archivo   
   }
}


Como podrán observar el código es muy simple. La linea resaltada en rojo corresponde el lugar donde se guardara el archivo. En este caso se crea en la carpeta principal del proyecto. Es posible escribir cualquier ubicación válida, por ejemplo "d:/pantalla.png", "c:/capturas/pantalla.png", etc.

Si deseamos conocer los formatos de imagen disponibles podemos mostrarlos con el siguiente código.
String writerNames[] = ImageIO.getWriterFormatNames();
     for(String aux:writerNames){
         System.out.println(aux);
     }

Parece una forma muy simple de realizar capturas de pantalla. Pero lo más útil sería que fuera una interfaz gráfica la que te ayudara a realizar esta función. Todo depende de la creatividad e imaginación del programador.

Mi aplicación.
En mi caso las interfaces gráficas no son lo mio, realice una aplicación sencilla que nos permite fácilmente capturar la pantalla o parte de ella y almacenarla en un archivo en múltiples formatos. El único formato que al parecer no me funciono fue wbmp,WBMP

La app tiene un tamaño de 83.4 kb y puedes guardarla en tu memoria usb.

Al posicionar el cursor sobre los elementos de la aplicación podemos obtener la descripción de sus funciones.

¿Como funciona?
1.-El funcionamiento es muy sencillo, el botón con el icono realiza la captura de pantalla.
2.-Puedes elegir 2 tipos de capturas:
    a)Pantalla completa: Como su nombre lo dice captura toda la pantalla.
    b)Seleccionado: Captura el área seleccionada. ¿Como seleccionar? Cuando se elige "Seleccionado" la ventana permite ser re dimensionada y sirve para capturar el área cubierta por la ventana de la aplicación.

3.-Tipo de Imagen: Selecciona el formato para exportar la imagen. Puede ser jpg, jpeg,gif,png . La opción predeterminada es png ya que genera imágenes más claras.

4.- Delay(segundos):  Es el tiempo que debe pasar entre ocultar la ventana de aplicación y realizar la captura. Evita que se incluya la ventana de aplicación en la captura. En caso de que aparezcan restos de la ventana se debe aumentar el valor. Si quiere incluir la ventana de la aplicación en la imagen seleccione 0.

5.-Guardar en: Su función es elegir la carpeta donde se guarda la imagen. Si no lo define se mostrará Ubicación de la aplicación. Esto quiere decir que la captura se almacenara en la carpeta donde se ubica la aplicación y se nombrara como captura_11062013_22-58-27.png  donde los números significan día,mes, año_hora-minuto-segundo

6.-Abrir imagen creada. Esta opción permite que después de generado el archivo se muestre con el visor de imágenes. Si marca la opción se mostrará la imagen, de lo contrario no.



Si deseas probar la aplicación puedes descargarla .

MEGA Screen.rar (54 KB)
DropBox Screen.rar(54 KB)
Box Screen.rar(54 KB)




miércoles, 15 de mayo de 2013

 JavaMail(Parte 1) Enviar Mail Simple

Hoy comienzo un pequeño tutorial para enviar correos electrónicos desde una aplicación en Java. Explicare desde enviar un mensaje simple desde una cuenta predeterminada hasta como enviar un correo a múltiples destinatarios, con múltiples adjuntos con detección de servidores de correo mas utilizados.

Que necesitamos:
Obviamente contar con el JDK instalado en el equipo.
Librerias JavaMail 
NetBeans(Para las interfaces gráficas).

Los datos necesarios para enviar un email son los siguientes:
  • Servidor SMTP. Direccion SMTP de su proveedor de Correos.
  • Puerto del Servidor SMTP. El puerto en el cual nos conectaremos.
  • Usuario. El usuario para conectarnos al Servidor SMTP.
  • Password. La contraseña.
  • Destinatario. Las personas a las que va dirigido el mensaje.
  • Destinatario para copia. 
  • Destinatario para copia oculta.
  • Asunto. El asunto del mensaje.
  • Mensaje. Es la información que queremos enviar.
  • Adjuntos. Los archivos que se enviarán junto al mensaje.

Lista de Servidores SMTP.


GMail
Servidor SMTP: smtp.gmail.com
Puerto: 465,587 (según mis pruebas 465 para mensajes normales y 587 para mensajes con aduntos)

HotMail, Live, Outlook
Servidor SMTP: smtp.live.com
Puerto: 587

 Yahoo Mail
Servidor SMTP:smtp.mail.yahoo.com
Puerto:587

Después de aclarar lo necesario, las partes que contiene un correo electrónico y los servidores SMTP mas utilizados crearemos el ejemplo más sencillo. En este ejemplo todos los datos están definidos y solo debemos ejecutar el código.

Remplazar por su usuario, contraseña y destinatario para que funcione.

-------Recuerden importar las librerías al proyecto----------



import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public  class EnviarCorreo {
    final String miCorreo = "ejemplo@gmail.com";
    final String miContraseña = "miPassword";
    final String servidorSMTP = "smtp.gmail.com";
    final String puertoEnvio = "465";
    String mailReceptor = null;
    String asunto = null;
    String cuerpo = null;

    public EnviarCorreo(String mailReceptor, String asunto,
            String cuerpo) throws MessagingException {
        this.mailReceptor = mailReceptor;
        this.asunto = asunto;
        this.cuerpo = cuerpo;

        Properties props = new Properties();
        props.put("mail.smtp.user", miCorreo);
        props.put("mail.smtp.host", servidorSMTP);
        props.put("mail.smtp.port", puertoEnvio);
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.socketFactory.port", puertoEnvio);
        props.put("mail.smtp.socketFactory.class",
                "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback", "false");

        SecurityManager security = System.getSecurityManager();

   
            Authenticator auth = new EnviarCorreo.autentificadorSMTP();
            Session session = Session.getInstance(props, auth);
            // session.setDebug(true);

            MimeMessage msg = new MimeMessage(session);
            msg.setText(cuerpo);
            msg.setSubject(asunto);
            msg.setFrom(new InternetAddress(miCorreo));
            msg.addRecipient(Message.RecipientType.TO, new InternetAddress(
                    mailReceptor));
            Transport.send(msg);
     

    }

    private class autentificadorSMTP extends javax.mail.Authenticator {
        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(miCorreo, miContraseña);
        }
    }

    /**
     * @param args
     */
  public static void main(String[] args) throws MessagingException {
        // TODO Auto-generated method stub
//El destinatario puede ser cualquier direccion electronica válida
        EnviarCorreo EnviadorMail = new EnviarCorreo("destinatario@gmail.com",
                "Asunto", "Mensaje ");
        System.out.println("Mensaje Enviado");
    }

}


En la siguiente publicación Explicare como enviar un Correo Con datos Adjuntos.