SQLite
 sql >> Teknologi Basis Data >  >> RDS >> SQLite

Menggunakan SQLCipher dengan Android

Bagaimana saya bisa mengintegrasikan SQLCipher dengan mulus dengan database saya yang tidak terenkripsi, sehingga aplikasi saya berfungsi seperti biasa tetapi sekarang database dienkripsi?

Anda tidak. Antara lain, Anda harus menyesuaikan UI untuk meminta frasa sandi kepada pengguna, dan memastikan bahwa Anda dapat meminta frasa sandi tersebut sesuai kebutuhan (mis., pengguna melanjutkan tugas dari beberapa aktivitas "dalam", bukan hanya saat pengguna menjalankan aplikasi melalui ikon peluncur).

Saya ingin tutorial singkat tentang ini

Pertama, bukan itu cara kerja Stack Overflow.

Kedua, cakupan yang layak dari SQLCipher untuk Android membutuhkan banyak lebih dari yang dapat ditampung dalam satu jawaban Stack Overflow. Saya memiliki bab 18 halaman tentang subjek dalam buku saya, misalnya. Jawaban ini sudah lebih panjang dari sebagian besar pertanyaan Android, dan saya tidak akan menyalahkan orang karena menutup pertanyaan ini karena terlalu luas.

Bagaimana cara memeriksa apakah database tidak terenkripsi

Coba buka menggunakan SQLCipher untuk kelas Android dengan "" sebagai frasa sandi. Jika berhasil dibuka, database tidak terenkripsi. Jika gagal, database rusak atau terenkripsi, dan tanpa frasa sandi yang tepat, Anda tidak dapat membedakannya.

bagaimana saya bisa mengenkripsinya?

Pendekatan dasarnya adalah:

  • Buka database yang tidak terenkripsi

  • Gunakan ATTACH Pernyataan SQL untuk melampirkan file kosong sebagai database terenkripsi baru, menyediakan frasa sandi yang Anda inginkan, dan memberi nama database terlampir encrypted dalam sesi database Anda

  • Jalankan SELECT sqlcipher_export('encrypted') di database terbuka (tidak terenkripsi), yang akan mengekspor data dari database tidak terenkripsi ke database terenkripsi (dengan pengecualian versi skema database, yang ditangani pada langkah selanjutnya)

  • Panggil getVersion() pada database yang terbuka (tidak terenkripsi) dan tahan nilai tersebut sebentar

  • Tutup database yang tidak terenkripsi

  • Buka database terenkripsi, menggunakan kata sandi Anda

  • Panggil setVersion() pada database terenkripsi, memberikan nilai yang Anda cache dari getVersion() dari database yang tidak terenkripsi

  • Tutup database terenkripsi

  • Jika diinginkan, hapus database yang tidak terenkripsi dan ganti nama database yang dienkripsi menjadi nama database tidak terenkripsi yang sekarang telah dihapus, sehingga konversi Anda tampaknya terjadi di tempat

Metode utilitas ini menerapkan pendekatan di atas:

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

Untuk kepentingan pengungkapan penuh, saya sudah lama tidak mencoba ini, jadi mungkin perlu ada beberapa penyesuaian.

Haruskah saya melakukan ini hanya sekali?

Hanya Anda yang dapat menjawabnya, karena tidak ada seorang pun di sini yang akan tahu banyak tentang aplikasi Anda.

Ketika saya mengenkripsi database saya yang tidak terenkripsi, apakah SQLCipher membuat database baru?

Ya.

Jika ya, bagaimana saya harus mengelola yang baru ini?

Hanya Anda yang dapat menjawabnya, karena tidak ada seorang pun di sini yang akan tahu banyak tentang aplikasi Anda.

Dan bagaimana dengan database lama saya yang tidak terenkripsi? Apakah masih tetap di sana?

Ya, meskipun Anda dipersilakan untuk menghapusnya jika dan setelah Anda selesai melakukannya.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Fungsi Tanggal &Waktu SQLite

  2. Pengecualian Kueri SQLite Kode Kesalahan Sintaks Android Studio 1

  3. chmod gagal:EPERM (Operasi tidak diizinkan) di Android?

  4. SQLite Pilih Berbeda

  5. Pustaka Ruang Android gagal menyalin basis data dari Aset