2011-11-02 31 views
15

Thực tiễn tốt để lưu tên người dùng và mật khẩu trên thiết bị là gì?Android - Chúng tôi sẽ lưu tên người dùng và mật khẩu vào bộ nhớ thiết bị ở đâu?

Tôi đã trải qua nhiều câu trả lời trên Stackoverflow và bây giờ tôi hơi bối rối.

Tôi đang làm việc trên ứng dụng email và tôi muốn người dùng của mình cảm thấy hoàn toàn an toàn khi sử dụng ứng dụng đó.

Một số người khuyên chúng tôi nên mã hóa và lưu trong SharedPreference. Một số đề nghị chúng ta không nên lưu nó trên thiết bị ở tất cả.

Tôi chỉ muốn chi tiết của người dùng được lưu trữ ở nơi an toàn nhất có thể.

Bất kỳ trợ giúp nào, đề xuất sẽ được đánh giá cao.

Cảm ơn.

Trả lời

17

Bạn nên lưu bằng chứng xác thực người dùng bằng cách sử dụng lớp AbstractAccountAuthenticator. Không chỉ là siêu an toàn, nó cũng làm cho ứng dụng của bạn cảm thấy tích hợp hơn với Android. Bạn đã bao giờ đi đến màn hình "Tài khoản" trong cài đặt Android của mình và đã nhìn thấy tài khoản Facebook, Twitter và GMail của bạn chưa? Đó là bởi vì họ đang sử dụng Trình xác thực tài khoản. Ngoài ra, nó cho phép bạn liên kết các URI/ContentProviders với các tài khoản người dùng cụ thể. Để xem một ví dụ thực sự toàn diện (nhưng phức tạp) của tất cả điều này, hãy kiểm tra ví dụ SampleSyncAdapter.

+0

Cảm ơn đề xuất tuyệt vời này. Tôi đang thử nó ngay bây giờ. :) tôi sẽ cho bạn biết nếu tôi sẽ phải đối mặt với bất kỳ rắc rối trong khi áp dụng kỹ thuật này. Cảm ơn một lần nữa. – Varundroid

-3

SharedPreference là tùy chọn tốt nhất.

  1. Dễ sử dụng
  2. Chỉ xóa khi dùng xóa dữ liệu cho các ứng dụng
  3. linh hoạt để thay đổi giá trị khi người dùng sử dụng một tập hợp các thông tin đăng nhập.

Đây là cách bạn có thể thực hiện.

import android.preference.PreferenceManager; 

private static final String LOGIN_EMAIL = "login_email"; 
private static SharedPreferences mAppPreferences; 
private static SharedPreferences.Editor mEditor; 

/*Insert your code to Get user entry of email from the EditText*/ 

mAppPreferences = PreferenceManager.getDefaultSharedPreferences(context); 
mEditor = mAppPreferences.edit(); 
mEditor.putString(LOGIN_EMAIL, v_user_email); 
mEditor.commit(); 

Tôi không nghĩ rằng bộ nhớ SharedPreference không an toàn hoặc có thể bị giả mạo.

+1

điều thú vị là, nếu bạn sử dụng một cái gì đó như ACRA để làm ngoại lệ đăng nhập cho bạn, nó sẽ đổ ra tất cả những người dùng chia sẻ prefs tại thời điểm vụ tai nạn, do đó, mật khẩu được tiếp xúc ngay tại đó ... thú vị. – topwik

+0

@towpse bạn có thể đổ tất cả những gì bạn muốn nhưng bạn không bao giờ có thể sử dụng mật khẩu đó để đăng nhập vào ứng dụng. – Aakash

+2

phụ thuộc vào ứng dụng phải không? – topwik

1

Bạn có bất kỳ quyền kiểm soát phía máy chủ nào hoặc đây có phải là ứng dụng email chung không? Nếu bạn có thể kiểm soát phía máy chủ, tôi sẽ làm một cái gì đó như xác thực, sau đó có máy chủ tạo ra một UUID và giữ cho địa phương để gọi api trong tương lai. Một ý tưởng khác là gửi một băm mật khẩu cho các cuộc gọi api thay vì mật khẩu thực, sau đó bạn có thể lưu trữ băm mật khẩu cục bộ.

Vấn đề với mã hóa tên người dùng/mật khẩu là mã của bạn cần có khả năng giải mã và nếu mã của bạn có thể giải mã, ai đó cũng có thể đảo ngược mã của bạn và thực hiện điều đó, mặc dù bạn có thể dễ dàng hơn/khó hơn bằng cách bạn viết mã và gói nó.

Khi bạn tìm ra WHAT bạn đang lưu trữ, bạn có thể tìm ra cách bạn lưu trữ nó. Một tài khoản? Các prefs được chia sẻ. Nhiều tài khoản? Tạo một Sqlite DB.

Tôi khuyên bạn nên sử dụng http://ormlite.com/ để xử lý các kết nối db của mình. Tôi đã làm một đoạn tốt của công việc cổng Android ban đầu, và nó bây giờ đã được tăng cường/duy trì bởi một nhóm đỉnh cao của tin tặc. Những thứ rất chắc chắn.

Xem thêm các bài đăng trên blog Sqlite:

http://www.touchlab.co/blog/single-sqlite-connection/ http://www.touchlab.co/blog/android-sqlite-locking/

1

Nếu bảo mật là một mối quan tâm, cuối cùng nó vẫn nắm để lưu thông tin xác thực người dùng ở dạng được mã hóa. Dưới đây là một số đề xuất:

  1. Xem xét mã hóa thông tin đăng nhập bằng Base64.

  2. Khóa mã hóa phải được chia thành các phần khác nhau và được lưu trong các phần khác nhau của ứng dụng. Chỉ được kết hợp bởi logic ứng dụng.

  3. Cân nhắc sử dụng JNI để mã hóa một phần của mã.

  4. Khi bạn có logic mã hóa tại chỗ, bạn nên sử dụng AbstractAccountAuthenticator.

Hãy nhớ hai điều: a. Gói ứng dụng có thể được giải mã để truy xuất khóa. (Đó là lý do tại sao (2) và (3)). b. Lưu văn bản thuần túy là thảm họa. (Đó là lý do tại sao (1)).

Trên suy nghĩ thứ hai, khi bạn có 1, 2 và 3 tại chỗ, bạn cũng có thể sử dụng SharedPreferences.

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