Guide de développement

Local Navigation

Sécurité des bases de données SQLite

Votre base de données SQLite peut disposer de l'un des niveaux de sécurité suivants :

  • Aucun cryptage : un fichier en texte brut accessible à partir de n'importe quelle application sur le smartphone.
  • Cryptage : un fichier crypté accessible à partir de n'importe quelle application sur le smartphone.
  • Cryptage et protection : un fichier crypté accessible uniquement à partir des applications sur le smartphone qui sont signées avec la même clé de signature de code.
  • Protection du contenu en plus du cryptage et de la protection : un fichier crypté et protégé qui utilise la protection du contenu pour crypter la clé primaire SQLite et fournit une protection supplémentaire lorsque le smartphone est verrouillé.

Les applications contenant des informations sensibles doivent utiliser des bases de données cryptées et protégées afin d'empêcher d'autres applications d'utiliser la méthode attach pour y accéder.

Il n'existe pas de façon de limiter l'accès à une base de données en texte brut, car celle-ci peut être lue avec les opérations d'E/S de fichier.

Les sections suivantes décrivent chacun des niveaux de sécurité.

Cryptage

Le cryptage contribue à empêcher la copie de fichiers d'un smartphone et leur lecture. L'algorithme utilisé pour mettre en œuvre le cryptage SQLite est AES 256.

Pour transférer une base de données cryptée vers un autre smartphone, vous devez d'abord la décrypter.

Une application peut ouvrir ou créer une base de données cryptée uniquement lorsque le smartphone est déverrouillé. Si une base de données est ouverte alors que le smartphone est verrouillé, la base de données reste lisible et ouverte en écriture.

Le cryptage n'empêche pas d'autres applications sur le smartphone d'accéder à votre base de données. Pour limiter l'accès, vous devez protéger votre base de données en la signant à l'aide d'une clé de signature de code.

L'échantillon de code suivant crée une base de données cryptée mais non signée. Un objet DatabaseSecurityOptions appelé dbso est créé. Il transmet comme valeur de paramètre unique : true.

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();
}

Cryptage et protection

Pour qu'une base de données ne soit accessible que par l'application à laquelle elle est destinée, signez cette base de données avec une clé de signature de code. Pour limiter l'accès à une application, utilisez une clé unique générée à l'aide de l'outil BlackBerry Signing Authority Tool. Cette signature est distincte de la signature du code des API contrôlées.

Vous pouvez également utiliser la clé de signature de code pour partager l'accès à la base de données avec certaines autres applications. Lorsque plusieurs applications sont signées avec la même clé, elles ont toutes accès à la base de données.

L'échantillon de code suivant crypte et protège une base de données existante. En premier lieu, l'échantillon de code récupère la clé de signature de code à partir d'un fichier appelé XYZ. Ensuite, il crypte et signe la base de données. Si la base de données est déjà cryptée, la méthode encrypt est fermée.

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

Protection du contenu en plus du cryptage et de la protection

La protection du contenu crypte des clés de cryptage afin qu'elles soient inaccessibles lorsque le smartphone est verrouillé.

Même lorsqu'un fichier de base de données est crypté, le niveau de protection maximal est atteint lorsque la protection du contenu est activée. Avec la protection du contenu, une application peut ouvrir ou créer une base de données cryptée uniquement lorsque le smartphone est déverrouillé.

Une base de données cryptée doit être fermée le plus tôt possible. Une connexion de base de données ouverte pourrait être sujette à des attaques par démarrage à froid.

Pour plus d'informations à propos de la protection du contenu, consultez le document BlackBerry Java SDK Security Guide (BlackBerry Java SDK - Guide de Sécurité), disponible à l'adresse www.blackberry.com/go/devguides.

Échantillon de code : création d'une base de données SQLite cryptée

Par défaut, les fichiers de base de données sont stockés sur une carte multimédia. Si vous utilisez BlackBerry Smartphone Simulator, vous devrez peut-être simuler une carte multimédia.

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();
      }
   }
}
Sujet précédent: Simuler une carte multimédia

Ces informations vous ont-elles été utiles ? Envoyez-nous vos commentaires.