Guida allo sviluppo

Local Navigation

Protezione dei database SQLite

Il database SQLite può disporre di uno dei seguenti livelli di protezione:

  • Nessuna crittografia: un file di testo normale, accessibile da qualsiasi applicazione sullo smartphone.
  • Crittografia: un file crittografato, accessibile da qualsiasi applicazione sullo smartphone.
  • Crittografia e protezione: un file crittografato, accessibile solo dalle applicazioni sullo smartphone firmate con la stessa chiave di firma codice.
  • Protezione del contenuto oltre a crittografia e protezione: un file crittografato e protetto, che utilizza la protezione del contenuto per crittografare la chiave master SQLite e offre protezione aggiuntiva quando lo smartphone è bloccato.

Le applicazioni contenenti informazioni sensibili devono utilizzare database crittografati e protetti, per impedire ad altre applicazioni di utilizzare il metodo attach per accedere a tali informazioni.

Non è possibile limitare l'accesso a un database di testo normale perché è possibile leggerlo tramite le operazioni di I/O del file.

Le sezioni seguenti descrivono ciascuno dei livelli di protezione.

Crittografia

La crittografia impedisce la copia dei file da uno smartphone e la relativa lettura da parte di altri utenti. L'algoritmo utilizzato per implementare la crittografia SQLite è AES 256.

Per trasferire un database crittografato su un altro smartphone, è necessario prima decrittografarlo.

Un'applicazione può aprire o creare un database crittografato solo quando lo smartphone è sbloccato. Se un database viene aperto con lo smartphone bloccato, il database continua a essere leggibile e scrivibile.

La crittografia non impedisce ad altre applicazioni dello smartphone di accedere al database dell'utente. Per limitare l'accesso, è necessario proteggere il database firmandolo con una chiave di firma codice.

Nell'esempio di codice seguente, viene creato un database crittografato ma non firmato. Viene creato un oggetto DatabaseSecurityOptions denominato dbso, che passa true come singolo valore di parametro.

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

Crittografia e protezione

Se si desidera limitare l'accesso a un database in modo che possa essere utilizzato solo dall'applicazione di cui fa parte, è necessario firmare il database con una chiave di firma codice. Per limitare l'accesso a un'applicazione, è necessario utilizzare una chiave univoca, generata tramite BlackBerry Signing Authority Tool. Questa firma è diversa dalla firma codice creata per le API controllate.

È possibile anche utilizzare la chiave di firma codice per condividere l'accesso al database con altre applicazioni specifiche. Se più applicazioni vengono firmate con la stessa chiave, tali applicazioni hanno tutte accesso al database.

Nell'esempio di codice seguente, viene crittografato e protetto un database esistente. Inizialmente, l'esempio di codice recupera la chiave di firma codice da un file chiamato XYZ. Successivamente, crittografa e firma il database. Se il database è già crittografato, il metodo encrypt viene chiuso correttamente.

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

Protezione del contenuto oltre a crittografia e protezione

La protezione del contenuto crittografa le chiavi di crittografia in modo che risultino inaccessibili quando lo smartphone è bloccato.

Anche quando un file del database è crittografato, il massimo livello di protezione viene raggiunto quando è attivata la protezione del contenuto. Con la protezione del contenuto, un'applicazione può aprire o può creare un database crittografato solo quando lo smartphone è sbloccato.

È necessario chiudere un database crittografato il prima possibile. Una connessione al database aperta potrebbe essere suscettibile agli attacchi al momento dell'avvio a freddo.

Per ulteriori informazioni sulla protezione del contenuto, consultare Guida a BlackBerry Java SDK - Protezione, disponibile all'indirizzo www.blackberry.com/go/devguides.

Esempio di codice: creazione di un database SQLite crittografato

I file di database vengono archiviati in una scheda di memoria per impostazione predefinita. Se si utilizza BlackBerry Smartphone Simulator, potrebbe essere necessario simulare una scheda di 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();
      }
   }
}
Argomento successivo: Prestazioni del database SQLite

Le informazioni sono state utili? Inviateci i vostri commenti.