Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Java / SQLite / SQLite: Encriptación de datos

SQLite: Encriptación de datos

Autor jc mouse viernes, julio 4, 2014

SQLite es un sistema de gestión de bases de datos relacional,  escrita en C, si se desea hacer uso de encriptación con SQLite, existen librerías como wxSQLite, SQLiteCrypt, botansqlite3, SQLCipher, etc. que pueden ser de mucha ayuda, sin embargo también podemos implementar la encriptación desde el lenguaje de alto nivel que estemos usando, por ejemplo java y eso es precisamente la razón de este post.

En este sencillo ejemplo encriptaremos datos usando java y los guardaremos en la base de datos, posteriormente recuperaremos esos datos y los desencriptaremos para poder utilizarlos 🙂

Necesitamos

– Java y el IDE Netbeans 7.x

– Conocimientos sobre SQLite

– Conector sqlitejdbc

– Conocimientos básicos sobre encriptación

Manos a la obra

1. Crea una base de datos en SQLite y añade la siguiente tabla:

CREATE TABLE "Nombres" ("Nombre" CHAR, "Apellido" CHAR)

2. Crea un proyecto en Netbeans (nombre: SQLiteCrypto)  y dale la siguiente forma:

proyecto sqlite

No olvides añadir el conector «sqlitejdbc»

3.  La aplicación se ejecutara en consola así que no nos preocuparemos de interfaces 🙂

Comenzaremos con la clase «Encriptación.java«, java cuenta con su propia librería para realizar encriptacion la cual es  javax.crypto,  Este paquete proporciona las clases e interfaces para realizar operaciones criptográficas. Las operaciones criptográficas definidas en este paquete incluyen encriptación, generación de claves y acuerdo de claves y generación de códigos de autentificación de mensajes.  Incluye algoritmos de cifrado simétricos, asimétricos, por bloques y de flujo.

En este ejemplo haremos uso del algoritmo de cifrado DES (Data Encryption Standard) 🙂

package com.bolivia.crypto;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.swing.JOptionPane;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
 * @web https://www.jc-mouse.net/
 * @author Mouse
 */
public class Encriptacion {

    private SecretKey key;   
    private String skey="";    
    private Cipher desCipher;

     /**
 * Constrcutor de clase
 */
    public Encriptacion(){}

    /**
 * Crea la Llave para encriptar/desencriptar
 * @param String value
 */
    public void addKey( String value ){
        try {
            skey = value;
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digestOfPassword = md.digest( value.getBytes("utf-8") );  
            byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);  
            key = new SecretKeySpec(keyBytes, "DESede");
        } catch (NoSuchAlgorithmException ex) {
            System.err.println( ex.getMessage() );
        } catch (UnsupportedEncodingException ex) {
            System.err.println( ex.getMessage() );
        }
    }

    public String getsKey(){
        return skey;
    }

    /**
 * Metodo para encriptar un texto
 * @param String texto
 * @return String texto encriptado
 */
    public String encrypt( String texto ){
        String value="";
        try {
            desCipher = Cipher.getInstance("DESede");
             //inicia el Cipher para la encriptacion
            desCipher.init( Cipher.ENCRYPT_MODE, key );             
            byte[] byteDataToEncrypt = texto.getBytes();
            byte[] byteCipherText = desCipher.doFinal(byteDataToEncrypt);             
            value = new BASE64Encoder().encode( byteCipherText );
        } catch (NoSuchAlgorithmException ex) {
            System.err.println( ex.getMessage() );
        } catch (NoSuchPaddingException ex) {
            System.err.println( ex.getMessage() );
        } catch (InvalidKeyException ex) {
            System.err.println( ex.getMessage() );
        } catch (IllegalBlockSizeException ex) {
            System.err.println( ex.getMessage() );
        } catch (BadPaddingException ex) {
            System.err.println( ex.getMessage() );
        }
        return value;
    }

    /**
 * Metodo para desencriptar un texto
 * @param texto Texto encriptado
 * @return String texto desencriptado
 */
    public String decrypt( String texto ){
        String strDecryptedText="";
        byte[] value;
        try {
            value = new BASE64Decoder().decodeBuffer(texto);

            desCipher = Cipher.getInstance("DESede");
            desCipher.init( Cipher.DECRYPT_MODE, key, desCipher.getParameters() );                                  
            byte[] byteDecryptedText = desCipher.doFinal( value );
            strDecryptedText = new String(byteDecryptedText);                                  
        } catch (InvalidKeyException ex) {
            System.err.println( ex.getMessage() );
        }  catch (IllegalBlockSizeException ex) {
            System.err.println( ex.getMessage() );
        } catch (BadPaddingException ex) {
            System.err.println( ex.getMessage() );
            JOptionPane.showMessageDialog( null , "La contraseña es incorrecta." );
        }   catch (IOException ex) {
            System.err.println( ex.getMessage() );
        } catch (InvalidAlgorithmParameterException ex) {
            System.err.println( ex.getMessage() );
        } catch (NoSuchAlgorithmException ex) {
            System.err.println( ex.getMessage() );
        } catch (NoSuchPaddingException ex) {
            System.err.println( ex.getMessage() );
        }
        return strDecryptedText;
    }

}

4. A continuación tenemos la clase SQLite.java que se extenderá de Encriptacion.

Reemplazar esta linea (private String db= «E:\\sqlite\\dbCrypto.sqlite»;  ) con la ruta y nombre del archivo sqlite, su base de datos 🙂

package com.bolivia.sqlite;
import com.bolivia.crypto.Encriptacion;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * @web https://www.jc-mouse.net/
 * @author Mouse
 */
public class SQLite extends Encriptacion{

    private Connection connection = null;
    private ResultSet resultSet = null;
    private Statement statement = null;
    private String db= "E:\\sqlite\\dbCrypto.sqlite";   

    /**
 * Constructor de clase que se conecta a la base de datos SQLite
 */
    public SQLite()
    {
      try{
         Class.forName("org.sqlite.JDBC");
         connection = DriverManager.getConnection("jdbc:sqlite:" + this.db );
         System.out.println("Conectado a la base de datos SQLite [ " + this.db + "]");
      }catch(Exception e){
         System.out.println(e);
      }

    }

   /** METODO PARA INSERTAR UN REGISTRO EN LA BASE DE DATOS
 * @param table Nombre de la tabla
 * @param fields String con los nombres de los campos donde insertar Ej.: campo1,campo2campo_n
 * @param values String con los datos de los campos a insertar Ej.: valor1, valor2, valor_n
 * @return Boolean
 */
    public boolean insert(String table, String fields, String values)
    {
        boolean res=false;        
        String q=" INSERT INTO " + table + " ( " + fields + " ) VALUES ( " + values + " ) ";        
        try {
            PreparedStatement pstm = connection.prepareStatement(q);
            pstm.execute();
            pstm.close();
            res=true;
         }catch(Exception e){
            System.err.println( e.getMessage() );
        }
      return res;
    }

    /** METODO PARA REALIZAR UNA CONSULTA A LA BASE DE DATOS
 * @param ninguno
 * @return String tabla 
 */
    public String printTable()
    {
       String res=" Nombre | Apellido \n ";
       try {
         statement = connection.createStatement();
         resultSet = statement.executeQuery(" SELECT * FROM Nombres ; ");
         while (resultSet.next())
         {
           res+= decrypt( resultSet.getString("Nombre") ) + " | " +  decrypt(resultSet.getString("Apellido")) + " \n ";
         }
        }
        catch (SQLException ex) {
           System.out.println(ex);
        }
       return res;
    }

}

5. Finalmente implementamos la clase en el Main de la siguiente forma:

package com.bolivia.crypto;
import com.bolivia.sqlite.SQLite;
/**
 * @web https://www.jc-mouse.net/
 * @author Mouse
 */
public class Main {

    public static void main(String[] args) {

        SQLite sqlite = new SQLite();
        sqlite.addKey("123456");
        //Nuevos registros
        sqlite.insert("nombres", " Nombre, Apellido ", " '"+sqlite.encrypt("Benito")+"','"+sqlite.encrypt("Camela")+"' ");
        sqlite.insert("nombres", " Nombre, Apellido ", " '"+sqlite.encrypt("Lola")+"','"+sqlite.encrypt("Mento")+"' ");
        sqlite.insert("nombres", " Nombre, Apellido ", " '"+sqlite.encrypt("Débora")+"','"+sqlite.encrypt("Dora")+"' ");
        sqlite.insert("nombres", " Nombre, Apellido ", " '"+sqlite.encrypt("Encarna")+"','"+sqlite.encrypt("Vales")+"' ");
        sqlite.insert("nombres", " Nombre, Apellido ", " '"+sqlite.encrypt("Francisco")+"','"+sqlite.encrypt("Jones")+"' ");
        sqlite.insert("nombres", " Nombre, Apellido ", " '"+sqlite.encrypt("Andrés")+"','"+sqlite.encrypt("Trozado")+"' ");

        //Se imprimen la tabla de nombres
        System.out.println( sqlite.printTable() );        
    }
}

– Creamos una instancia, asignamos una llave para el algoritmo de encriptacion, a continuación realizamos la inserccion de registros a la base de datos y recuperemos para imprimirlos en pantalla. 🙂

DES algoritmo

benitocamelo rescon

Proyecto: AQUI JEFE

Lamento no ser tan detallado 🙂 me falto tiempo para completarlo pero lo publico antes de que se me olvide y se quede en el baúl de los recuerdos. PAZ

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

ODBC acces y php POO

ODBC acces y php POO

En este tuto crearemos una clase para conectarse con una base de datos Access y ademas se implementan dos metodos para r...

Envío de correo HTML con php

Envío de correo HTML con php

PHP cuenta con la función mail que nos permite el envío de correo desde nuestro servidor web bool mail ( string $to , st...

Graficos estadisticos con javafx y swing

Graficos estadisticos con javafx y swing

En este post aprenderemos a usar los gráficos 2d que viene con JavaFX en nuestras aplicaciones java swing. Esto puede se...

Hacker ataca pagina web de «El Diario»

Hacker ataca pagina web de «El Diario»

El portal del periodico boliviano «El diario» fue atacado este domingo 25 de septiembre por un Hacker identificado por e...

Procesamiento de imágenes en java con ImageMagick

Procesamiento de imágenes en java con ImageMagick

im4java es una interfaz pura de Java para la línea de comandos de ImageMagick. La interfaz de la línea de comandos de IM...

Mapas en HTML5 – Uniendo todo – Parte 6

Mapas en HTML5 – Uniendo todo – Parte 6

Última parte del tutorial «Mapas interactivos HTML5», vamos uniendo todo todo el código. En la parte 5 de este tutorial,...

1 comentario en “SQLite: Encriptación de datos”

  1. Mouse dice:

    no se puede si no conoces la clave

Los comentarios estan cerrados

Comparte lo que sabes

Categorias

Últimas entradas

En este post veremos un ejemplo sencillo de como descargar desde Internet archivos de cualquier tipo (*.jpg, *.png, *.gi...

FFmpeg es una colección de software libre capaz de decodificar, codificar, transcodificar, mux, demux, transmitir, filtr...

The Age of AI o «La era de la Inteligencia Artificial»,  es una serie de 8 documentales de Youtube Original, presentados...

La comunidad 3D Buzz  era una de los lugares donde la gente curiosa de aprender a realizar videojuegos buscaba recursos...

Herramientas

Generador de Enlaces a Whatsapp