Làm cách nào để tôi có thể tích hợp liền mạch SQLCipher với cơ sở dữ liệu chưa được mã hóa hiện có của mình, để ứng dụng của tôi hoạt động như bình thường nhưng bây giờ các cơ sở dữ liệu đã được mã hóa?
Bạn không. Trong số những thứ khác, bạn phải điều chỉnh giao diện người dùng của mình để yêu cầu người dùng nhập cụm mật khẩu và đảm bảo rằng bạn có thể yêu cầu cụm mật khẩu đó nếu cần (ví dụ:người dùng tiếp tục một nhiệm vụ từ một số hoạt động "bên trong", không chỉ khi người dùng chạy ứng dụng thông qua biểu tượng trình khởi chạy).
Tôi muốn có một hướng dẫn ngắn về điều này
Đầu tiên, đó không phải là cách Stack Overflow hoạt động.
Thứ hai, phạm vi phù hợp của SQLCipher dành cho Android mất nhiều nhiều hơn có thể vừa với một câu trả lời Tràn ngăn xếp duy nhất. Ví dụ, tôi có một chương dài 18 trang về chủ đề này trong cuốn sách của mình. Câu trả lời này đã dài hơn đại đa số các câu hỏi về Android và tôi sẽ không trách mọi người đóng câu hỏi này là quá rộng.
Làm cách nào để kiểm tra xem cơ sở dữ liệu chưa được mã hóa
Hãy thử mở nó bằng SQLCipher dành cho các lớp Android với ""
làm cụm mật khẩu. Nếu nó mở thành công, cơ sở dữ liệu không được mã hóa. Nếu không thành công, cơ sở dữ liệu bị hỏng hoặc bị mã hóa và không có cụm mật khẩu thích hợp, bạn không thể phân biệt được.
làm cách nào để mã hóa nó?
Cách tiếp cận cơ bản là:
-
Mở cơ sở dữ liệu không được mã hóa
-
Sử dụng
ATTACH
Câu lệnh SQL để đính kèm một tệp trống để dùng làm cơ sở dữ liệu được mã hóa mới, cung cấp cụm mật khẩu mong muốn của bạn và đặt tên cho cơ sở dữ liệu được đính kèm làencrypted
trong phiên cơ sở dữ liệu của bạn -
Chạy
SELECT sqlcipher_export('encrypted')
trong cơ sở dữ liệu mở (không được mã hóa), cơ sở dữ liệu này sẽ xuất dữ liệu từ cơ sở dữ liệu chưa được mã hóa sang cơ sở dữ liệu được mã hóa (ngoại trừ phiên bản lược đồ cơ sở dữ liệu, được xử lý trong các bước sau) -
Gọi
getVersion()
trên cơ sở dữ liệu mở (không được mã hóa) và giữ giá trị đó một chút -
Đóng cơ sở dữ liệu không được mã hóa
-
Mở cơ sở dữ liệu được mã hóa, sử dụng cụm mật khẩu của bạn
-
Gọi
setVersion()
trên cơ sở dữ liệu được mã hóa, cung cấp giá trị bạn đã lưu vào bộ nhớ đệm từgetVersion()
của cơ sở dữ liệu không được mã hóa -
Đóng cơ sở dữ liệu được mã hóa
-
Nếu muốn, hãy xóa cơ sở dữ liệu chưa được mã hóa và đổi tên cơ sở dữ liệu được mã hóa thành tên của cơ sở dữ liệu chưa được mã hóa hiện đã bị xóa để chuyển đổi của bạn dường như diễn ra tại chỗ
Phương thức tiện ích này thực hiện phương pháp trên:
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ì lợi ích của việc tiết lộ đầy đủ, tôi đã không thử điều này trong một thời gian và do đó, có thể cần phải điều chỉnh một số.
Tôi có nên làm điều này chỉ một lần không?
Chỉ bạn mới có thể trả lời điều đó, vì không ai ở đây sẽ biết nhiều về ứng dụng của bạn.
Khi tôi mã hóa cơ sở dữ liệu chưa được mã hóa hiện có của mình, SQLCipher có tạo cơ sở dữ liệu mới không?
Có.
Nếu có, tôi nên quản lý cái mới này như thế nào?
Chỉ bạn mới có thể trả lời điều đó, vì không ai ở đây sẽ biết nhiều về ứng dụng của bạn.
Và cơ sở dữ liệu cũ của tôi không được mã hóa thì sao? Nó có còn ở đó không?
Có, mặc dù bạn có thể xóa nó nếu và khi bạn làm xong.