Yêu cầu Oct 24th, 2018 8:21 a.m. 614 0 2
  • 614 0 2
+1

Cách lưu thông tin bảo mật trong Android

Chia sẻ
  • 614 0 2

Mọi người cho mình hỏi chút vấn đề với!!!!! Mình muốn lưu những thông tin quan trọng của user vào device. Thì có thể dùng cách nào để lưu? (Thông tin này có nhiều trường và tạo thành 1 List (Bình thường sẽ dùng sqlLite)) Ai đã từng làm cho mình ý kiến với nhé!!!!!!!!!!!

2 CÂU TRẢ LỜI


Đã trả lời Oct 26th, 2018 3:16 p.m.
Đã được chấp nhận
+1

Mình có 1 số gợi ý để tăng tính bảo mật trong việc lưu trữ trong Android, bạn có thể cần chú ý các điểm sau :

  • Hạn chế tối thiểu việc truyền biến lưu trữ thông tin nhạy cảm giữa các function, service mà không qua mã hóa. Một ví dụ về phương thức tấn công theo dạng này là code reuse attacks
  • Hạn chế request các permission không cần thiết
  • Lưu trữ thông tin dưới local khi đã mã hóa

Nói tóm lại là cần mã hóa dữ liệu trước khi gửi/ lưu/ chia sẻ dữ liệu. Dưới dây là một số mã hóa thông dụng:

  • Cách cây nhà lá vườn là dùng các loại hash đơn giản như MD5 để encrypt chuỗi. Cách này thích hợp cho việc lưu trữ nhanh các chuỗi , đơn giản, dễ hiểu
  • Cách hơi lập dị: lưu xuống file trong internal storage với mode MODE_PRIVATE. Theo lý thuyết thì các data này sẽ chặn các ứng dụng khác đọc nó. Nhưng mình thấy cách này khá vô dụng, vì mình vẫn có thể lấy được data dạng này nếu muốn 😄
  • Đối với loại database truyền thống như SQLLite, bạn có thể dùng kèm với SQLCipher để mã hóa data khi lưu. Nói dễ hiểu là bạn đưa nó 1 cái key, nó sẽ encrypt db cho bạn, muốn đọc db lên được phải đưa đúng key cho nó. Vấn đề thú vị ở đây là bạn sẽ lưu cái key đó ở đâu cho an toàn 😄 , ở đây mình có biết một số mô hình thông dụng:
    • Lưu hard-code cái key đó trong share preference 😄 hoặc chỗ nào khó tìm trong project 😄 (cách củ chuối)
    • Yêu cầu user nhập passcode hoặc mã PIN, dùng mã PIN của user làm key
    • Lưu key và database trên server, user chỉ có thể truy cập thông tin qua các request gửi tới server (cách này không phù hợp với câu hỏi của bạn)
  • Đối với ORM database như GreenDAO, Realm đều có hỗ trợ việc crypto db, bạn có thể tìm hiểu thử
  • Dùng KeyStore của Android. Đây là 1 phương thức mã hóa mà Android cung cấp sẵn, tuy nhiên với các thuật toán phức tạp hơn thôi. Bạn có thể tìm hiểu nếu thích.

Tuy nhiên nên lưu ý việc encrypt data luôn đi kèm với viêc giảm performance, quá trình đọc ghi sẽ chậm hơn rất nhiều, tùy vào mục đích cụ thể mà dùng. Mà an toàn nhất là đừng lưu dưới local 💩

Chia sẻ
Đã trả lời Oct 25th, 2018 8:05 a.m.
+1

Trong câu hỏi của bạn đã có 1 cách rồi, đó là sử dụng sqlite. Ngoài ra, bạn có thể sử dụng SharedPreferences để lưu. Dữ liệu sẽ được lưu dưới dạng key - value. Chỉ có kiểu giá trị boolean, float, int, long, string mới được hỗ trợ. Vậy nên, do dữ liệu của bạn có nhiều trường, thì bạn cần chuyển nó về dạng đơn giản hơn để lưu (chẳng hạn bạn encode nó thành string và lưu lại, sau này decode nó thành json là xong).

Bình thường mình sẽ dùng Gson để convert json - string cho nhau. Ví dụ với Kotlin:

data class User(val name: String, val age: Int);

// Somewhere
val user = User("Doanh", 26);
val jsonString = Gson().toJson(user, User::class.java);

// Somewhere
val user = Gson().fromJson(jsonString, User::class.java);
Chia sẻ
Oct 26th, 2018 12:05 a.m.

mình có làm nhiều về 2 cách sqlite và SharedPreferences trong android rồi. Ý mình muốn hỏi có cách nào tính bảo mật cao không? Vì nhưng thông tin này là thông tin thẻ tín dụng nên cần độ bảo mật cao. Mình có đọc thấy dùng keystore mà cũng chưa rõ lắm.

Oct 26th, 2018 6:56 a.m.

mã hóa trước khi lưu, lấy ra thì giải mã

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí