SQLite
 sql >> Database >  >> RDS >> SQLite

Utilizzo di SQLCipher con Android

Come posso integrare perfettamente SQLCipher con il mio database non crittografato esistente, in modo che la mia app funzioni normalmente ma ora i database sono crittografati?

Tu no. Tra le altre cose, devi modificare la tua interfaccia utente per chiedere all'utente una passphrase e assicurarti di poter chiedere quella passphrase secondo necessità (ad esempio, l'utente riprende un'attività da un'attività "interna", non solo quando l'utente esegue il tuo app tramite un'icona di avvio).

Vorrei un breve tutorial su questo

Primo, non è così che funziona Stack Overflow.

In secondo luogo, una copertura decente di SQLCipher per Android richiede molto più di quanto possa stare in una singola risposta Stack Overflow. Ho un capitolo di 18 pagine sull'argomento nel mio libro, per esempio. Questa risposta è già più lunga della maggior parte delle domande su Android e non incolperei le persone per aver chiuso questa domanda come troppo ampia.

Come devo verificare se il database non è crittografato

Prova ad aprirlo utilizzando le classi SQLCipher per Android con "" come passphrase. Se si apre correttamente, il database non è crittografato. Se ciò non riesce, il database è danneggiato o crittografato e senza la passphrase corretta, non puoi dire la differenza.

come posso crittografarlo?

L'approccio di base è:

  • Apri il database non crittografato

  • Usa il ATTACH Istruzione SQL per allegare un file vuoto da utilizzare come nuovo database crittografato, fornendo la passphrase desiderata e denominando il database allegato encrypted all'interno della sessione del database

  • Esegui SELECT sqlcipher_export('encrypted') nel database aperto (non crittografato), che esporterà i dati dal database non crittografato a quello crittografato (ad eccezione della versione dello schema del database, che verrà gestita nei passaggi successivi)

  • Chiama getVersion() sul database aperto (non crittografato) e mantieni quel valore per un po'

  • Chiudi il database non crittografato

  • Apri il database crittografato, utilizzando la tua passphrase

  • Chiama setVersion() sul database crittografato, fornendo il valore memorizzato nella cache da getVersion() del database non crittografato

  • Chiudi il database crittografato

  • Se lo desideri, elimina il database non crittografato e rinomina quello crittografato con il nome di quello non crittografato ora eliminato, in modo che la conversione sembri avvenuta.

Questo metodo di utilità implementa l'approccio di cui sopra:

  public static void encrypt(Context ctxt, String dbName,
                             String passphrase) throws IOException {
    File originalFile=ctxt.getDatabasePath(dbName);

    if (originalFile.exists()) {
      File newFile=
          File.createTempFile("sqlcipherutils", "tmp",
                              ctxt.getCacheDir());
      SQLiteDatabase db=
          SQLiteDatabase.openDatabase(originalFile.getAbsolutePath(),
                                      "", null,
                                      SQLiteDatabase.OPEN_READWRITE);

      db.rawExecSQL(String.format("ATTACH DATABASE '%s' AS encrypted KEY '%s';",
                                  newFile.getAbsolutePath(), passphrase));
      db.rawExecSQL("SELECT sqlcipher_export('encrypted')");
      db.rawExecSQL("DETACH DATABASE encrypted;");

      int version=db.getVersion();

      db.close();

      db=
          SQLiteDatabase.openDatabase(newFile.getAbsolutePath(),
                                      passphrase, null,
                                      SQLiteDatabase.OPEN_READWRITE);
      db.setVersion(version);
      db.close();

      originalFile.delete();
      newFile.renameTo(originalFile);
    }
  }

Nell'interesse della piena divulgazione, non lo provo da un po', quindi potrebbe essere necessario apportare alcune modifiche.

Devo farlo solo una volta?

Solo tu puoi rispondere, poiché nessuno qui saprà molto della tua app.

Quando crittografo il mio database non crittografato esistente, SQLCipher crea un nuovo database?

Sì.

Se sì, come dovrei gestire questo nuovo?

Solo tu puoi rispondere, poiché nessuno qui saprà molto della tua app.

E che dire del mio vecchio database che non è crittografato? Resta ancora lì?

Sì, anche se sei libero di eliminarlo se e quando hai finito.