sql >> Databáze >  >> RDS >> SQLite

Použití SQLCipher s Androidem

Jak mohu bez problémů integrovat SQLCipher se svou stávající nešifrovanou databází, aby moje aplikace fungovala jako normálně, ale nyní jsou databáze šifrované?

Ty ne. Kromě jiného musíte upravit své uživatelské rozhraní tak, aby uživatele požádalo o přístupovou frázi, a zajistit, abyste o tuto přístupovou frázi mohli požádat podle potřeby (např. uživatel obnoví úlohu z nějaké „vnitřní“ aktivity, nejen když uživatel spustí vaši aplikace prostřednictvím spouštěcí ikony).

Chtěl bych na to krátký tutoriál

Za prvé, takto Stack Overflow nefunguje.

Za druhé, slušné pokrytí SQLCipher pro Android zabere hodně více, než se vejde do jediné odpovědi Stack Overflow. Ve své knize mám na toto téma například 18stránkovou kapitolu. Tato odpověď je již delší než naprostá většina otázek pro Android a nevinil bych lidi, že tuto otázku uzavřeli jako příliš širokou.

Jak mám zkontrolovat, zda je databáze nezašifrovaná

Zkuste jej otevřít pomocí tříd SQLCipher pro Android s "" jako přístupová fráze. Pokud se úspěšně otevře, databáze je nešifrovaná. Pokud to selže, databáze je buď poškozená, nebo zašifrovaná, a bez správné přístupové fráze nepoznáte rozdíl.

jak to mohu zašifrovat?

Základní přístup je:

  • Otevřete nezašifrovanou databázi

  • Použijte ATTACH Příkaz SQL pro připojení prázdného souboru, který bude sloužit jako nová šifrovaná databáze, poskytne požadovanou přístupovou frázi a pojmenuje připojenou databázi encrypted v rámci relace databáze

  • Spusťte SELECT sqlcipher_export('encrypted') v otevřené (nešifrované) databázi, která vyexportuje data z nešifrované databáze do šifrované (s výjimkou verze schématu databáze, která je řešena v dalších krocích)

  • Zavolejte getVersion() v otevřené (nešifrované) databázi a chvíli podržte tuto hodnotu

  • Zavřete nešifrovanou databázi

  • Otevřete zašifrovanou databázi pomocí své přístupové fráze

  • Zavolejte setVersion() v zašifrované databázi, poskytující hodnotu, kterou jste uložili do mezipaměti z getVersion() nešifrované databáze

  • Zavřete šifrovanou databázi

  • Pokud chcete, smažte nešifrovanou databázi a přejmenujte šifrovanou na název nyní smazané nešifrované databáze, aby se zdálo, že se konverze uskutečnila na místě

Tato metoda nástroje implementuje výše uvedený přístup:

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

V zájmu úplného odhalení jsem to už nějakou dobu nezkoušel, takže možná bude potřeba provést nějaké úpravy.

Mám to udělat pouze jednou?

Na to můžete odpovědět pouze vy, protože nikdo tady o vaší aplikaci moc neví.

Když zašifruji svou stávající nezašifrovanou databázi, vytvoří SQLCipher novou databázi?

Ano.

Pokud ano, jak bych měl spravovat tento nový?

Na to můžete odpovědět pouze vy, protože nikdo tady o vaší aplikaci moc neví.

A co moje stará databáze, která je nešifrovaná? Stále tam zůstává?

Ano, i když jej můžete smazat, pokud a až s tím skončíte.




  1. RMAN Backup příkazy

  2. Unikání jednoduché uvozovky v PLSQL

  3. Systémové databáze SQL Server – údržba MSDB

  4. Co je MySQL ekvivalentem STUFF() na SQL Serveru?