2012-02-11 21 views
83

Tôi tự hỏi về bảo mật tùy chọn được chia sẻ.Android SharedPreference security

Có thể truy cập vào sharedpreferences, ngay cả khi chúng được tạo trong MODE_PRIV (0)?
Có thể liệt kê tất cả các sharedpreferences có sẵn và sau đó lấy tất cả các thiết lập từ các ứng dụng khác?
Có phải chia sẻ địa điểm tốt để đưa dữ liệu nhạy cảm, chẳng hạn như mật khẩu hoặc mã thông báo xác thực không?

Cảm ơn

+0

có thể trùng lặp của [Các tệp SQLite và SharedPreferences an toàn như thế nào trên Android?] (Http://stackoverflow.com/questions/3608883/how-secure-are-sqlite-and- sharedpreferences-files-on-android) –

Trả lời

185

Preferences chung là sto màu đỏ dưới dạng tệp trong hệ thống tệp trên thiết bị. Theo mặc định, chúng được lưu trữ trong thư mục dữ liệu của ứng dụng với bộ tiền tố hệ thống tập tin chỉ cho phép UID mà ứng dụng cụ thể chạy với để truy cập chúng. Vì vậy, chúng là tư nhân trong rất nhiều như quyền truy cập tập tin Linux hạn chế quyền truy cập vào chúng, giống như trên bất kỳ hệ thống Linux/Unix.

Bất kỳ ai có quyền truy cập cấp gốc vào thiết bị đều có thể xem chúng, vì người chủ có quyền truy cập vào mọi thứ trên hệ thống tệp. Ngoài ra, mọi ứng dụng chạy với cùng UID như ứng dụng tạo sẽ có thể truy cập chúng (điều này thường không được thực hiện và bạn cần thực hiện hành động cụ thể để làm cho hai ứng dụng chạy với cùng UID, vì vậy đây có thể không phải là một ứng dụng lớn mối quan ngại). Cuối cùng, nếu ai đó có thể gắn hệ thống tệp của thiết bị của bạn mà không sử dụng hệ điều hành Android được cài đặt, họ cũng có thể bỏ qua các quyền hạn chế quyền truy cập.

Nếu bạn lo lắng về việc truy cập như vậy vào sở thích của bạn (hoặc bất kỳ dữ liệu nào được viết bởi ứng dụng của bạn), thì bạn sẽ muốn mã hóa nó. Nếu bạn lo ngại về chúng, bạn sẽ cần tìm ra chính xác mức độ bảo vệ cần thiết cho mức độ rủi ro mà bạn thấy. Có một cuộc thảo luận rất rộng rãi về điều này trong Application Security for the Android Platform, vừa được xuất bản vào tháng 12 năm 2011 (tuyên bố từ chối trách nhiệm: Tôi là tác giả của cuốn sách này).

+2

+1 Đó là một câu trả lời tuyệt vời: súc tích và cung cấp thông tin. Cảm ơn! –

+2

Có tài liệu chính thức nào nói về điều này không? Bạn có lời khuyên nào chưa? – clu

10

Thông thường, không có, họ không thể được truy cập bởi các ứng dụng khác, tuy nhiên, bạn nên lưu ý rằng SharedPreferences được lưu trữ dưới dạng file XML trong /data/data/ thư mục, trong đó chủ yếu có nghĩa là bất kỳ ứng dụng với đặc quyền superuser trên một thiết bị rootedthể truy cập SharedPreference của bạn, ngay cả khi chúng được tạo ra với MODE_PRIV

19

SharedPreferences là gì, nhưng các file XML trong của bạn điện thoại/dữ liệu/dữ liệu/thư mục, Vì vậy, bất kỳ ứng dụng hoặc người dùng với privilages superuser trên một thiết bị bắt nguồn từ thể truy cập SharedPreferences của bạn, ngay cả khi chúng được tạo ra với MODE_PRIV

Tuy có một cách để bảo vệ nó từ mọi người ... Vui lòng thanh toán liên kết này. Ở đây bạn có thể lưu trữ dữ liệu bằng mã hóa, lớp này tự giải thích và rất dễ sử dụng.

https://github.com/sveinungkb/encrypted-userprefs

Như đã nói bởi những người khác ai cũng có thể truy cập vào nó nhưng trong trường hợp này không ai có thể đọc dữ liệu bên trong nó vì nó được mã hóa. Vì vậy, bảo mật của nó.Đối với Tối đa bảo mật đề xuất của tôi sẽ là tạo khóa được sử dụng để mã hóa vào thời gian chạy thay vì mã hóa cứng nó. Có nhiều cách để làm điều đó :)

+3

thì làm cách nào để bạn lưu khóa đã tạo? – Olayinka

+1

@Olayinka Sẽ an toàn hơn khi mã hóa bằng một khóa khác và lưu nó trong 'SharedPref'. Nhưng sau đó, phải làm gì với chìa khóa khác? Nghiêm túc, mặc dù kịch bản tốt nhất sẽ gửi khóa được mã hóa và UID thiết bị đến máy chủ bằng SSL để được lưu trữ ở đó và được truy xuất khi cần. Điều đó sẽ yêu cầu kết nối, nhưng sẽ cho phép bạn bôi đen một thiết bị và đột nhiên có tất cả dữ liệu được chuyển vào thùng rác. Nếu không có kết nối internet không đổi, bất kỳ cố gắng mã hóa dữ liệu nào cũng không an toàn 100%. –

+0

Tôi đã sử dụng giải pháp trên ... nó hoạt động 9 trong số 10 lần..nhưng tôi đang gặp lỗi: 1e06b065: Các hàm mã hóa: EVP_DecryptFinal_ex: BAD_DECRYPT "vào các thời điểm..Không ai có ý tưởng? –