Guía de desarrollo

Local Navigation

Seguridad de las bases de datos SQLite

La base de datos SQLite puede tener uno de los siguientes niveles de seguridad:

  • Ningún cifrado: un archivo de texto sin formato al que se puede acceder desde cualquier aplicación del smartphone.
  • Cifrado: un archivo cifrado al que se puede acceder desde cualquier aplicación del smartphone.
  • Cifrado y protección: un archivo cifrado al que se puede acceder desde las aplicaciones del smartphone firmadas con la misma clave de firma de código.
  • Protección de contenido además de cifrado y protección: un archivo cifrado y protegido que utiliza protección de contenido para cifrar la clave principal de SQLite y ofrecer protección adicional cuando el smartphone está bloqueado.

Las aplicaciones que contienen información confidencial deben utilizar bases de datos cifradas y protegidas para impedir que otras aplicaciones utilicen el método attach para acceder a ellas.

Es imposible restringir el acceso a una base de datos de texto sin formato porque se puede leer con operaciones de archivo E/S.

Las siguientes secciones describen cada uno de los niveles de seguridad.

Cifrado

El cifrado ayuda a impedir la copia y lectura de archivos de un smartphone. El algoritmo utilizado para implementar el cifrado en SQLite es AES 256.

Para transferir una base de datos cifrada a otro smartphone, primero la debe descifrar.

Una aplicación puede abrir o puede crear una base de datos cifrada sólo cuando el smartphone está desbloqueado. Si la base de datos está abierta cuando el smartphone está bloqueado, la base de datos continuará siendo de lectura y escritura.

El cifrado no impide que otras aplicaciones del smartphone accedan a la base de datos. Para restringir el acceso, debe proteger su base de datos mediante una firma con una clave de firma de código.

El ejemplo de código siguiente crea una base de datos cifrada pero no firmada. Crea un objeto DatabaseSecurityOptions llamado dbso que pasa true como valor de parámetro único.

try
{
    URI myURI = URI.create("file:///SDCard/Databases/SQLite_Guide/" +
    "MyEncryptedDatabase.db");
    DatabaseSecurityOptions dbso = new DatabaseSecurityOptions(true);
    d = DatabaseFactory.create(myURI,dbso);
    d.close();
}
catch ( Exception e )
{
    System.out.println( e.getMessage() );
    e.printStackTrace();
}

Cifrado y protección

Si quiere restringir una base de datos para que sólo pueda acceder a ella la aplicación de la que forma parte, debe firmar la base de datos con una clave de firma de código. Para restringir el acceso a una aplicación, debe utilizar una clave única que se genere mediante BlackBerry Signing Authority Tool. Esta firma es distinta de la firma de código para API controladas.

También puede utilizar la clave de firma de código para compartir el acceso a la base de datos con otras aplicaciones específicas. Si varias aplicaciones están firmadas con la misma clave, todas ellas tendrán acceso a la base de datos.

El ejemplo de código siguiente cifra y protege una base de datos existente. Primero, el ejemplo de código recupera la clave de firma de código de un archivo llamado XYZ. A continuación cifra y firma la base de datos. Si la base de datos ya está cifrada, el método encrypt se cierra sin más complicaciones.

CodeSigningKey codeSigningKey = 
    CodeSigningKey.get(CodeModuleManager.getModuleHandle( "SQLiteDemo" ), "XYZ");
try
    {
    DatabaseFactory.encrypt(uri, new DatabaseSecurityOptions(codeSigningKey));
    }
    catch(DatabaseException dbe)
    {
    errorDialog("Encryption failed - " + dbe.toString());         
    }

Protección de contenido además de cifrado y protección

La protección de contenido cifra las claves de cifrado de forma que sean inaccesibles cuando el smartphone está bloqueado.

Aunque un archivo de base de datos esté cifrado, se consigue el nivel de protección máximo cuando la función de protección de contenido está activada. Con la protección de contenido activa, una aplicación sólo puede abrir o crear una base de datos cifrada cuando el smartphone está desbloqueado.

Una base de datos cifrada se debe cerrar tan pronto como sea posible. Una conexión de base de datos abierta podría ser susceptible a ataques cuando arranca en frío.

Para obtener más información sobre la protección de contenido, consulte la Guía de seguridad de BlackBerry Java SDK, disponible en www.blackberry.com/go/devguides.

Ejemplo de código: crear una base de datos SQLite cifrada

De forma predeterminada, los archivos de base de datos se almacenan en una tarjeta multimedia. Si usa un BlackBerry Smartphone Simulator, quizás necesite simular una tarjeta de memoria.

import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.database.*;
import net.rim.device.api.io.*;
public class CreateEncryptedDatabase extends UiApplication
{
   public static void main(String[] args)
   {
      CreateEncryptedDatabase theApp = new CreateEncryptedDatabase(); 
      theApp.enterEventDispatcher();
   }
   public CreateEncryptedDatabase()
   { 
      pushScreen(new CreateEncryptedDatabaseScreen());
   }
}
class CreateEncryptedDatabaseScreen extends MainScreen
{
   Database d; 
   public CreateEncryptedDatabaseScreen()
   {
      LabelField title = new LabelField("SQLite Create Encrypted Database Sample",
      LabelField.ELLIPSIS |
      LabelField.USE_ALL_WIDTH);
      setTitle(title);
      add(new RichTextField("Creating an encrypted database called " +
      "MyEncryptedDatabase.db on the microSD card."));
      try
      {
         URI myURI = URI.create("file:///SDCard/Databases/SQLite_Guide/" +
         "MyEncryptedDatabase.db");
         DatabaseSecurityOptions dbso = new DatabaseSecurityOptions(true);
         d = DatabaseFactory.create(myURI,dbso);
         d.close();
      }
      catch ( Exception e )
      {
         System.out.println( e.getMessage() );
         e.printStackTrace();
      }
   }
}

¿Le ha resultado útil esta información? Envíenos sus comentarios.