Anda di halaman 1dari 8

Base de

Datos Sqlite:
Seguridad.
Taller de Base
de Datos.
Integrantes:
Hau K Jesus Manuel.
Uc Pool Ernesto Alfonso.

INTRODUCCIN

Sqlite es un gestor de base de datos donde no se utiliza niveles de


contraseas y no se puede crear usuarios. Para poder lograr la seguridad en
este gestor se utiliza la encriptacin de datos para poder proteger la
informacin contenida en ella. Se pueden utilizar diferentes libreras para la
encriptacin de datos.
CONTENIDO.

SQLite es un sistema de gestin de bases de datos relacional, escrita en C, si


se desea hacer uso de encriptacin con SQLite, existen libreras
como wxSQLite, SQLiteCrypt, botansqlite3, SQLCipher, etc. que pueden ser
de mucha ayuda, sin embargo, tambin podemos implementar la
encriptacin desde el lenguaje de alto nivel que estemos usando, por
ejemplo, java y eso es precisamente la razn 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.
Pasos para crear el proyecto en netbeans:
1. Crea una base de datos en SQLite y aade la siguiente tabla: CREATE
TABLE "Nombres" ("Nombre" CHAR, "Apellido" CHAR)
2. Crea un proyecto en Netbeans (nombre: SQLiteCrypto) y dale la
siguiente forma:

No olvides aadir el conector sqlitejdbc


3. La aplicacin se ejecutara en consola as que no nos
reocuparemos de interfaces.

CONTENIDO DE LAS CLASES EN JAVA.

ENCRIPTACION.JAVA
Comenzaremos con la clase Encriptacin.java, java cuenta con su propia
librera para realizar encriptacin la cual es javax.crypto, Este paquete
proporciona las clases e interfaces para realizar operaciones criptogrficas.
Las operaciones criptogrficas definidas en este paquete incluyen
encriptacin, generacin de claves y acuerdo de claves y generacin de
cdigos de autentificacin de mensajes. Incluye algoritmos de cifrado
simtricos, asimtricos, 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 http://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 contrasea 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;
}
}

SQLITE.JAVA
Esta es la clase donde se crea la conexin de la base de datos con SQLITE
al igual contiene los mtodos para insertar y realizar consultas en la misma.
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 http://www.jc-mouse.net/
* @author Mouse
*/
public class SQLite extends Encriptacion{
private
private
private
private

Connection connection = null;


ResultSet resultSet = null;
Statement statement = null;
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;
}
}

"

MAIN.JAVA
Se encarga de insertar los datos dentro de la base de datos de manera que
se encriptan cuando pasa por el mtodo de encriptacin de forma
automtica seguidamente se visualiza en pantalla en este caso en la parte
de consola de netbeans.
package com.bolivia.crypto;
import com.bolivia.sqlite.SQLite;
/**
* @web http://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,
'"+sqlite.encrypt("Benito")+"','"+sqlite.encrypt("Camela")+"' ");
sqlite.insert("nombres",
"
Nombre,
'"+sqlite.encrypt("Lola")+"','"+sqlite.encrypt("Mento")+"' ");
sqlite.insert("nombres",
"
Nombre,
'"+sqlite.encrypt("Dbora")+"','"+sqlite.encrypt("Dora")+"' ");
sqlite.insert("nombres",
"
Nombre,
'"+sqlite.encrypt("Encarna")+"','"+sqlite.encrypt("Vales")+"' ");
sqlite.insert("nombres",
"
Nombre,
'"+sqlite.encrypt("Francisco")+"','"+sqlite.encrypt("Jones")+"' ");
sqlite.insert("nombres",
"
Nombre,
'"+sqlite.encrypt("Andrs")+"','"+sqlite.encrypt("Trozado")+"' ");
//Se imprimen la tabla de nombres
System.out.println( sqlite.printTable() );
}
}

Apellido

",

"

Apellido

",

"

Apellido

",

"

Apellido

",

"

Apellido

",

"

Apellido

",

"

ENCRIPTACIN DE LA BASE DE DATOS.

Aqu se puede apreciar como


la informacin de la tabla nombre ha sido encriptada.
CONCLUSIN:
Se lleg a la conclusin que la seguridad que da el gestor de base de datos
sqlite es nulo para que nosotros podamos proteger nuestros registros se
necesitara encriptar el archivo eso lo podemos lograr con el ejemplo que se
les mostro de primero donde necesitamos el JDBC de sqlite y un lenguaje de
programa.
REFERENCIAS:
http://www.jc-mouse.net/java/sqlite-encriptacion-de-datos
http://blog.video2brain.com/mx/seguridad-base-datos-sqlite-4657.htm

Anda mungkin juga menyukai