SQLite
 sql >> Base de données >  >> RDS >> SQLite

Utiliser SQLCipher avec Android

Comment puis-je intégrer de manière transparente SQLCipher à ma base de données non chiffrée existante, afin que mon application fonctionne normalement, mais que les bases de données soient désormais chiffrées ?

Vous ne le faites pas. Entre autres choses, vous devez ajuster votre interface utilisateur pour demander à l'utilisateur une phrase secrète et vous assurer que vous pouvez demander cette phrase secrète au besoin (par exemple, l'utilisateur reprend une tâche à partir d'une activité "interne", pas seulement lorsque l'utilisateur exécute votre app via une icône de lancement).

Je voudrais un petit tutoriel à ce sujet

Tout d'abord, ce n'est pas ainsi que fonctionne Stack Overflow.

Deuxièmement, une couverture décente de SQLCipher pour Android prend beaucoup plus que ne peut tenir dans une seule réponse Stack Overflow. J'ai un chapitre de 18 pages sur le sujet dans mon livre, par exemple. Cette réponse est déjà plus longue que la grande majorité des questions Android, et je ne reprocherais pas aux gens de fermer cette question comme étant trop large.

Comment vérifier si la base de données n'est pas chiffrée

Essayez de l'ouvrir en utilisant les classes SQLCipher pour Android avec "" comme phrase de passe. S'il s'ouvre avec succès, la base de données n'est pas chiffrée. Si cela échoue, soit la base de données est corrompue ou cryptée, et sans la phrase de passe appropriée, vous ne pouvez pas faire la différence.

comment puis-je le chiffrer ?

L'approche de base est :

  • Ouvrir la base de données non chiffrée

  • Utilisez le ATTACH Instruction SQL pour joindre un fichier vide devant servir de nouvelle base de données chiffrée, en fournissant la phrase de passe souhaitée et en nommant la base de données attachée encrypted dans votre session de base de données

  • Exécutez le SELECT sqlcipher_export('encrypted') dans la base de données ouverte (non cryptée), qui exportera les données de la base de données non cryptée vers la base de données cryptée (à l'exception de la version du schéma de la base de données, qui est gérée dans les étapes ultérieures)

  • Appelez getVersion() sur la base de données ouverte (non cryptée) et conservez cette valeur pendant un moment

  • Fermez la base de données non chiffrée

  • Ouvrez la base de données chiffrée à l'aide de votre phrase secrète

  • Appelez setVersion() sur la base de données chiffrée, en fournissant la valeur que vous avez mise en cache à partir de getVersion() de la base de données non chiffrée

  • Fermez la base de données chiffrée

  • Si vous le souhaitez, supprimez la base de données non cryptée et renommez la base de données cryptée avec le nom de la base de données non cryptée maintenant supprimée, afin que votre conversion semble se produire sur place

Cette méthode utilitaire implémente l'approche ci-dessus :

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

Dans l'intérêt d'une divulgation complète, je n'ai pas essayé cela depuis un moment, et il faudra donc peut-être quelques ajustements.

Dois-je le faire une seule fois ?

Vous seul pouvez répondre à cette question, car personne ici ne connaîtra grand-chose de votre application.

Lorsque je chiffre ma base de données non chiffrée existante, SQLCipher crée-t-il une nouvelle base de données ?

Oui.

Si oui, comment dois-je gérer ce nouveau ?

Vous seul pouvez répondre à cette question, car personne ici ne connaîtra grand-chose de votre application.

Et qu'en est-il de mon ancienne base de données non cryptée ? Est-ce qu'il y reste encore ?

Oui, bien que vous puissiez le supprimer si et quand vous en avez terminé.