2015-01-25 24 views
6

Nhiệm vụ là để lưu các mật khẩu nhập (PasswordStr) hoặc mKey.getEncoded byte [] và sau đó tự động gửi tới API Crypto (Cipher)Làm cách nào để lưu trữ mật khẩu an toàn trên Android?

SecretKey mKey = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1").generateSecret(new PBEKeySpec(PasswordStr.toCharArray()); 

Rõ ràng là mật khẩu này cũng có thể được mã hóa, nhưng điều này sẽ yêu cầu mật khẩu khác và cứ thế vô cùng.

Có thể Android đã cung cấp cơ chế lưu trữ mật khẩu?

p.s sử dụng máy chủ từ xa là không thể. Cần được lưu trữ cục bộ.

+1

Trường hợp sử dụng của bạn là gì? Tại sao bạn cần phải lưu trữ một mật khẩu hoặc một chìa khóa ở tất cả? Hiện tại nó không rõ ràng nếu bạn muốn lưu trữ một mật khẩu hoặc một khóa. Với lựa chọn, hãy lưu khóa * đã tạo * (và tất cả muối công khai). Bạn không muốn rò rỉ mật khẩu của người dùng cho các bên khác! –

+0

Thật lý tưởng để lưu trữ mật khẩu chuỗi. Nhưng về nguyên tắc, mã nguồn Java không quan trọng. Tôi muốn đảm bảo người dùng của mình bảo mật dữ liệu của họ. Muối, lặp lại, vv có thể được nhìn thấy sau khi giải mã. – Mixer

+0

Bây giờ nó thậm chí còn ít ý nghĩa hơn. Muối không nên có trong mã, một muối nên được ngẫu nhiên, không phải [loại ngẫu nhiên] (http://xkcd.com/221/). Số lượng muối và số lần lặp lại có thể được công khai. –

Trả lời

0

bạn có thể sử dụng SQLCipher cho android. Nó là phần mở rộng của SQLite cung cấp mã hóa AES 256-bit trong suốt của các tệp cơ sở dữ liệu

+0

Nếu không có bất kỳ chi tiết bảo mật nào khác thì câu trả lời này không mạnh bằng nó. AES-256 thực sự không nói gì về mức độ bảo mật được cung cấp. –

2

Kiểm tra Handling Credentials section on the android developers guide. Tôi sẽ báo nó ở đây.

Nếu có thể, tên người dùng và mật khẩu sẽ không được lưu trữ trên thiết bị. Thay vào đó, hãy thực hiện xác thực ban đầu bằng tên người dùng và mật khẩu do người dùng cung cấp và sau đó sử dụng thời gian sống ngắn, mã thông báo ủy quyền dành riêng cho dịch vụ.

Các dịch vụ có thể truy cập được vào nhiều ứng dụng sẽ được truy cập bằng cách sử dụng AccountManager. Nếu có thể, hãy sử dụng lớp AccountManager để gọi dịch vụ dựa trên đám mây và không lưu trữ mật khẩu trên thiết bị.

Sau khi sử dụng AccountManager để lấy một Account, CREATOR trước khi đi qua trong bất kỳ thông tin, do đó bạn không vô tình vượt qua các thông tin để ứng dụng sai.

Nếu thông tin đăng nhập chỉ được sử dụng bởi các ứng dụng bạn tạo, thì bạn có thể xác minh ứng dụng truy cập vào Trình quản lý tài khoản bằng cách sử dụng checkSignature(). Ngoài ra, nếu chỉ một ứng dụng sẽ sử dụng thông tin đăng nhập, bạn có thể sử dụng một số KeyStore để lưu trữ.

+0

Điều này hoàn toàn chính xác, nhưng đôi khi có trường hợp sử dụng hợp lệ để lưu trữ mật khẩu (ví dụ: đối với dịch vụ của bên thứ 3) và câu trả lời này không giải quyết các vấn đề đó. –

3

Bạn có thể sử dụng Keystore API của Android.

Bí mật được mã hóa bằng mật khẩu chính được lấy từ mật khẩu hoặc ghim của điện thoại. Nó được coi là một giải pháp mã hóa dựa trên phần mềm tốt. Lưu ý rằng người dùng phải đặt mật khẩu/ghim trên điện thoại của mình để tính năng này hoạt động.

Nelenkov gives a good overview:

nhớ thông tin xác Android được thực hiện như một Linux mẹ đẻ dịch vụ (daemon), với một vài lớp bổ sung trên đầu trang của nó mà làm cho nó có sẵn để khuôn khổ.Hãy nhanh chóng xem lại những gì chúng ta biết về các keystore daemon (mô tả chi tiết ở đây):

  • đó là một daemon bản xứ, bắt đầu lúc khởi động
  • nó cung cấp một ổ cắm điều khiển tại chỗ để cho phép các ứng dụng và hệ thống dịch vụ để nói chuyện để nó
  • nó mã hóa các phím sử dụng một chút chủ AES 128
  • chìa khóa mã hóa khóa được lưu trong/data/misc/keystore, một tập tin cho mỗi khoá
  • chìa khóa tổng thể được bắt nguồn từ các thiết bị mở khóa mật khẩu hoặc mã pIN nó
  • cho phép các lệnh quản lý thực hiện và tiếp cận chủ chốt dựa trên gọi UID

Xem Android Documentation để biết thêm chi tiết.

+2

Tôi đang downvoting điều này vì tôi không nghĩ rằng điều này sẽ giải quyết được câu hỏi. Câu hỏi đặt ra là lưu trữ mật khẩu an toàn, không phải là khóa bí mật. Sử dụng kho khóa nền tảng * là một ý tưởng hay nói chung, nhưng nó cần phải được bổ sung với một ví dụ về cách lưu trữ mật khẩu với nó. –

+0

Trong ví dụ của bạn, bạn đang đề cập đến một khóa bí mật, vì vậy tôi nghĩ rằng đây sẽ là một giải pháp khả thi cho bạn. Dĩ nhiên bạn có thể sử dụng khóa để mã hóa mật khẩu (hoặc bất kỳ thứ gì khác) và điều này sẽ giúp bạn thoát khỏi chu kỳ mật khẩu ("... nhưng điều này sẽ yêu cầu mật khẩu khác và cứ thế vô cùng.") – jHilscher

+0

Vâng, tôi nghĩ điều này đã được yêu cầu, nhưng bây giờ tôi đang bối rối. Thu hồi downvote, hỏi org. poster để làm rõ trong ý kiến. –

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