2012-03-01 57 views
10

Tôi cần lưu trữ dữ liệu nhạy cảm trong cơ sở dữ liệu sqlite trong ứng dụng android.Android - Lưu trữ dữ liệu nhạy cảm trong cơ sở dữ liệu sqlite

Làm cách nào để đảm bảo dữ liệu này rất an toàn? Tôi biết tôi có thể mã hóa dữ liệu bằng cách sử dụng khóa, nhưng tôi lưu trữ khóa đó ở đâu? Tôi cũng không muốn yêu cầu người dùng điền vào một khóa, tôi chỉ muốn nó hoạt động trên chính nó. Vì tôi sợ kỹ thuật đảo ngược, tôi cũng không muốn đặt khóa mã hóa trong mã.

Tôi đã tìm hiểu về SQLCipher. Nó nói rằng đó là một cách rất an toàn để mã hóa dữ liệu trong cơ sở dữ liệu, nhưng tại sao nó lại như vậy? Tôi cũng không cần phải giữ một chìa khóa để mở khóa thông tin đó? Hay đây thực sự là một cách hoàn hảo để đảm bảo dữ liệu an toàn?

Và nếu không, thì cách nào (gần như) bằng chứng không lưu trữ dữ liệu nhạy cảm trong cơ sở dữ liệu sqlite?

Trả lời

8

Mật mã đối xứng yêu cầu mã khóa để mã hóa và cùng một khóa để giải mã. Không có cách nào xung quanh nó.

Không lưu khóa trong mã vì nó có thể được giải mã (Như bạn đã nói).

Yêu cầu người dùng nhập mật khẩu vào lần sử dụng đầu tiên và sử dụng PBKDF2 để lấy được khóa bảo mật mã hóa để sử dụng trong mã hóa.

Hoặc người dùng phải nhập mật khẩu hoặc bạn cần lưu trữ mật khẩu trong bộ nhớ. Điều tôi muốn làm là yêu cầu người dùng chỉ định thời lượng mà khóa sẽ được lưu trong bộ nhớ để sử dụng để giải mã.

Và nếu thời hạn hết hạn, người dùng S have phải nhập lại mật khẩu.

Tôi đã không kiểm tra kỹ SQLCipher nhưng nó nói nó sử dụng AES-256. AES là một thuật toán mã hóa đối xứng và nó cần một khóa để mã hóa và cùng một khóa để giải mã.

+1

Tôi đã đi với giải pháp này, tôi yêu cầu người dùng ghim mỗi khi ứng dụng được khởi động/mở, tôi sẽ tạo khóa của tôi dựa trên đó và loại bỏ nó sau khi ứng dụng được đóng lại – Pieter888

12

Bạn nói ...

Tôi không muốn yêu cầu người dùng điền vào một phím hoặc, tôi chỉ muốn nó để làm việc trên riêng của nó. Bởi vì tôi sợ kỹ thuật đảo ngược, tôi cũng không muốn đặt khóa mã hóa trong mã.

Thật không may, bạn cần thực hiện một trong những điều này (có thể, có thể). Bạn có thể yêu cầu người dùng nhập mật khẩu và lấy chìa khóa từ đó bằng thuật toán được thiết kế cho mục đích đó (được gọi là Mật khẩu dựa trên mật khẩu - PBE - và Android bao gồm một số thuật toán PBE tốt chuẩn). Bạn có thể lưu trữ khóa trong mã của bạn hoặc dưới dạng tài nguyên trong APK của bạn, nhưng sau đó ai đó sẽ có thể đảo ngược khóa đó. Bạn có thể làm như vậy và làm xáo trộn mã của bạn, điều này sẽ làm chậm quá trình kỹ thuật ngược lại, nhưng bạn không thể làm cho nó không thể được (mã của bạn sẽ cần phải xác định khóa tại một số thời điểm để nó chỉ là vấn đề của một kẻ tấn công tìm ra cách nó đang làm nó).

Các phương pháp khác đã được thử ở đây bao gồm buộc khách hàng kết nối lại với máy chủ để truy xuất khóa qua mạng ... nhưng sau đó điều gì sẽ xảy ra nếu kết nối mạng bị gián đoạn và điều gì ngăn máy chủ đưa khóa cho bất kỳ ai, như kẻ tấn công? Vâng, sau đó bạn có thể sử dụng SSL được xác thực lẫn nhau để đảm bảo chỉ khách hàng của bạn mới được phép nhận ... nhưng sau đó bạn cần lưu trữ khóa cá nhân SSL phía máy khách ... chính xác là cùng một vấn đề bạn hiện có.:)

Vì vậy, ... dòng dưới cùng là bạn cần một chìa khóa (hoặc một cái gì đó tương đương) để mã hóa/giải mã dữ liệu. Bạn có thể lưu trữ nó và làm cho nó khó khăn hơn cho một người nào đó để đảo ngược nó. Bạn có thể gây bất tiện cho người dùng và khiến họ nhập mật khẩu. Nhưng ... bạn cần kiến ​​thức bí mật đó bằng cách nào đó.

+2

Tôi e rằng bạn đúng , Tôi đã chọn sử dụng phương pháp PBKDF2 Ranhiro Cooray đã đề cập nên tôi đã đi với câu trả lời đó, nhưng câu trả lời vẫn tuyệt vời cảm ơn bạn :) – Pieter888

1

Có thể cho phép ứng dụng tự động tạo mật khẩu ngẫu nhiên không? Có thể là gen từ nơi, thời gian hoặc những thông tin khác, điều này sẽ không cần phải yêu cầu vượt qua của người dùng.

Các vấn đề liên quan