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

Brug af SQLCipher med Android

Hvordan kan jeg problemfrit integrere SQLCipher med min eksisterende ukrypterede database, så min app fungerer, som den fungerer normalt, men nu er databaserne krypteret?

Det gør du ikke. Du skal blandt andet justere din brugergrænseflade for at bede brugeren om en adgangssætning og sikre, at du kan bede om denne adgangssætning efter behov (f.eks. genoptager brugeren en opgave fra en eller anden "indre" aktivitet, ikke kun når brugeren kører din app via et startikon).

Jeg vil gerne have en kort vejledning om dette

For det første er det ikke sådan Stack Overflow fungerer.

For det andet kræver anstændig dækning af SQLCipher til Android meget mere end der kan være i et enkelt Stack Overflow-svar. Jeg har f.eks. et 18 sider langt kapitel om emnet i min bog. Dette svar er allerede længere end langt de fleste Android-spørgsmål, og jeg vil ikke bebrejde folk for at lukke dette spørgsmål som værende for bredt.

Hvordan skal jeg kontrollere, om databasen er ukrypteret

Prøv at åbne den ved hjælp af SQLCipher til Android-klasser med "" som adgangssætning. Hvis den åbnes, er databasen ukrypteret. Hvis det mislykkes, er databasen enten korrupt eller krypteret, og uden den korrekte adgangssætning kan du ikke kende forskel.

hvordan kan jeg kryptere det?

Den grundlæggende tilgang er:

  • Åbn den ukrypterede database

  • Brug ATTACH SQL-sætning for at vedhæfte en tom fil, der skal fungere som den nye krypterede database, angive din ønskede adgangssætning og navngive den vedhæftede database encrypted i din databasesession

  • Kør SELECT sqlcipher_export('encrypted') i den åbne (ukrypterede) database, som vil eksportere data fra den ukrypterede database til den krypterede (med undtagelse af databaseskemaversionen, som håndteres i senere trin)

  • Kald getVersion() på den åbne (ukrypterede) database, og hold den værdi lidt

  • Luk den ukrypterede database

  • Åbn den krypterede database ved hjælp af din adgangssætning

  • Kald setVersion() på den krypterede database, der leverer den værdi, du cachelagde fra getVersion() af den ukrypterede database

  • Luk den krypterede database

  • Hvis det ønskes, skal du slette den ukrypterede database og omdøbe den krypterede til navnet på den nu slettede ukrypterede, så din konvertering ser ud til at ske på plads

Denne hjælpemetode implementerer ovenstående tilgang:

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

Af hensyn til fuld afsløring har jeg ikke prøvet dette i et stykke tid, og derfor skal der muligvis foretages nogle justeringer.

Skal jeg kun gøre dette én gang?

Kun du kan svare på det, da ingen her kommer til at vide meget om din app.

Når jeg krypterer min eksisterende ukrypterede database, opretter SQLCipher en ny database?

Ja.

Hvis ja, hvordan skal jeg administrere denne nye?

Kun du kan svare på det, da ingen her kommer til at vide meget om din app.

Og hvad med min gamle database, som er ukrypteret? Bliver den der stadig?

Ja, selvom du er velkommen til at slette den, hvis og når du er færdig med den.




  1. Hvad er effekten af ​​at placere commit efter DML i procedure?

  2. SQL-server AlwaysOn-tilgængelighedsgrupper:Installation og konfiguration. Del 2

  3. Partitioneringsforbedringer i PostgreSQL 11

  4. psql:FATAL:database <bruger> eksisterer ikke