Entwicklungshandbuch

Local Navigation

Sicherheit von SQLite-Datenbanken

Ihre SQLite-Datenbank kann eine der folgenden Sicherheitsstufen besitzen:

  • Keine Verschlüsselung: Eine Nur-Text-Datei, auf die von einer beliebigen Anwendung auf dem Smartphone zugegriffen werden kann.
  • Verschlüsselung: Eine verschlüsselte Datei, auf die von einer beliebigen Anwendung auf dem Smartphone zugegriffen werden kann.
  • Verschlüsselung und Schutz: Eine verschlüsselte Datei, auf die nur von Anwendungen auf dem Smartphone zugegriffen werden kann, die mit demselben Codesignaturschlüssel signiert sind.
  • Inhaltsschutz zusätzlich zu Verschlüsselung und Schutz: Eine verschlüsselte und geschützte Datei, die Inhaltsschutz verwendet, um den SQLite-Hauptschlüssel zu verschlüsseln und zusätzlichen Schutz zu bieten, wenn das Smartphone gesperrt ist.

Anwendungen mit vertraulichen Informationen sollten verschlüsselte und geschützte Datenbanken verwenden, um andere Anwendungen daran zu hindern, mithilfe der attach-Methode auf sie zuzugreifen.

Es gibt keine Möglichkeit, den Zugriff auf eine Nur-Text-Datenbank zu beschränken, weil sie mit Datei-E/A-Vorgängen gelesen werden kann.

In den folgenden Abschnitten werden die einzelnen Sicherheitsstufen beschrieben.

Verschlüsselung

Verschlüsselung hilft zu verhindern, dass jemand Dateien von einem Smartphone kopiert und liest. Der Algorithmus, der für die SQLite-Verschlüsselung verwendet wird, lautet AES 256.

Um eine verschlüsselte Datenbank auf ein anderes Smartphone zu übertragen, müssen Sie diese zuerst entschlüsseln.

Eine Anwendung kann eine verschlüsselte Datenbank nur öffnen oder erstellen, wenn das Smartphone entsperrt ist. Wenn eine Datenbank beim Sperren eines Smartphones geöffnet ist, kann weiterhin in die Datenbank geschrieben und aus ihr gelesen werden.

Verschlüsselung hindert andere Anwendungen auf dem Smartphone nicht am Zugriff auf Ihre Datenbank. Um den Zugriff zu beschränken, müssen Sie Ihre Datenbank schützen, indem Sie sie mit einem Codesignaturschlüssel signieren.

Das folgende Codebeispiel erstellt eine Datenbank, die verschlüsselt, aber nicht signiert ist. Es wird ein DatabaseSecurityOptions-Objekt namens dbso erstellt, das true als Einzelparameterwert eingibt.

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

Verschlüsselung und Schutz

Wenn Sie eine Datenbank einschränken möchten, damit ein Zugriff nur durch die Anwendung möglich ist, von der sie ein Bestandteil ist, müssen Sie die Datenbank mit einem Codesignaturschlüssel signieren. Um den Zugriff auf eine Anwendung zu beschränken, sollten Sie einen einmaligen Schlüssel verwenden, den Sie mithilfe des BlackBerry Signing Authority Tool generieren. Diese Signatur ist eine andere, als die Codesignatur, die Sie für gesteuerte APIs erstellen.

Sie können auch den Codesignaturschlüssel verwenden, um den Zugriff auf die Datenbank für andere bestimmte Anwendungen freizugeben. Wenn mehrere Anwendungen mit demselben Schlüssel signiert wurden, haben all diese Anwendungen Zugriff auf die Datenbank.

Das folgende Codebeispiel verschlüsselt und schützt eine vorhandene Datenbank. Zuerst ruft das Codebeispiel den Codesignaturschlüssel einer Datei mit dem Namen XYZ ab. Als Nächstes wird die Datenbank verschlüsselt und signiert. Wenn die Datenbank bereits verschlüsselt ist, wird die encrypt-Methode ordnungsgemäß beendet.

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

Inhaltsschutz zusätzlich zu Verschlüsselung und Schutz

Inhaltsschutz verschlüsselt Verschlüsselungsschlüssel, sodass sie unzugänglich sind, wenn das Smartphone gesperrt ist.

Selbst wenn eine Datenbankdatei verschlüsselt ist, wird maximaler Schutz erreicht, wenn der Inhaltsschutz aktiviert ist. Bei aktiviertem Inhaltsschutz kann eine Anwendung eine verschlüsselte Datenbank nur dann öffnen oder erstellen, wenn das Smartphone entsperrt ist.

Eine verschlüsselte Datenbank sollte sobald wie möglich geschlossen werden. Eine geöffnete Datenbankverbindung kann anfällig für Kaltstartangriffe sein.

Weitere Informationen zu Inhaltsschutz, finden Sie im BlackBerry Java SDK Security Guide (Sicherheitshandbuch für BlackBerry Java SDK)unter www.blackberry.com/go/devguides.

Codebeispiel: Erstellen einer verschlüsselten SQLite-Datenbank

Datenbankdateien werden standardmäßig auf einer Medienkarte gespeichert. Wenn Sie einen BlackBerry Smartphone Simulator verwenden, müssen Sie möglicherweise eine Medienkarte simulieren.

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();
      }
   }
}
Vorheriges Thema: Simulieren einer Medienkarte

Waren diese Informationen hilfreich? Senden Sie uns Ihren Kommentar.