Mật khẩu Gmail được lưu trữ trong Android như thế nào - và ở đâu?


37

Tôi đã xem xét xung quanh và không tìm thấy thông tin nào về cách Android quản lý để lưu trữ mật khẩu trên thiết bị. Đặc biệt là mật khẩu Gmail. Tôi đang tìm hiểu cách Android mã hóa và lưu trữ mật khẩu? Nó sử dụng khóa nào và khóa này được lưu trữ ở đâu và thuật toán mã hóa nào được sử dụng.


1
Tại sao mật khẩu được lưu trữ phải được mã hóa bằng khóa? Điều này chỉ có nghĩa là người ta phải nhập khóa mỗi lần yêu cầu mật khẩu, sau đó bạn chỉ cần không lưu trữ mật khẩu và nhập mật khẩu mỗi lần.
Dòng chảy

Ừm, chìa khóa có thể là thiết bị cụ thể, được lấy từ IMEI của điện thoại hoặc thứ gì đó. Điều đó có nghĩa là, phần mềm có thể lấy khóa mà không cần người dùng phải gõ nó mọi lúc.
asudhak

1
Điều gì ngăn bất kỳ phần mềm nào khác chạy trên điện thoại để lấy chìa khóa? Cách tiếp cận này không thêm lớp bảo mật
Lưu lượng

Câu trả lời:


36

Ứng dụng chính thức của Gmail không lưu trữ mật khẩu trong thiết bị của bạn. Mật khẩu của bạn an toàn 100% nếu bạn sử dụng ứng dụng này.

Đây là cách thức hoạt động: Mật khẩu được sử dụng lần đầu tiên bởi các máy chủ xác thực của Google. Sau lần xác thực thành công đầu tiên, một Auth Tokentệp được tải xuống thiết bị được lưu trữ trong accounts.dbtệp dưới dạng văn bản thuần túy. Đối với tất cả các lần đăng nhập tiếp theo, điều này Auth Tokenđược sử dụng, KHÔNG phải mật khẩu ban đầu của bạn.
Vì vậy, nếu thiết bị của bạn bị đánh cắp, tất cả mọi người có thể nhận được là Auth Tokenkhông hợp lệ khi bạn thay đổi mật khẩu. Vì vậy, bạn sẽ ở trong lệnh cuối cùng.
Để bảo mật tối đa, tôi khuyên bạn nên bật 2-Factor Authenticationvà tạo Device Specific Passwordcho thiết bị của mình. Sau khi mất thiết bị, tất cả những gì bạn cần là vô hiệu hóa thiết bị đó. Bạn thậm chí không cần thay đổi mật khẩu chính.

Lưu ý: Tất cả đều không đúng nếu bạn sử dụng ứng dụng email của bên thứ ba cho Gmail viz. Ứng dụng Stock Email, K-9 Mail, vv Giao thức IMAP hoặc POP cần mật khẩu gốc để xác thực người dùng mọi lúc. Vì vậy, mật khẩu đơn giản cần phải có sẵn cho ứng dụng email trước khi gửi nó đến máy chủ. Vì vậy, hầu hết các ứng dụng email lưu trữ mật khẩu ở dạng văn bản đơn giản (băm / mã hóa là vô ích vì khóa băm / mã hóa cần được lưu trữ cục bộ). Trong trường hợp này, tôi khuyên bạn nên bật 2-Factor Authenticationvà tạo Device Specific Passwordcho thiết bị của mình. Sau khi mất thiết bị, tất cả những gì bạn cần là vô hiệu hóa thiết bị đó.

Cập nhật:
Về mặt kỹ thuật, có thể lưu trữ mật khẩu cục bộ ở dạng mã hóa / băm mà không giữ khóa mã hóa / khóa băm trong văn bản thuần túy cục bộ. Cảm ơn @JFSebastian đã chỉ ra nó. Thật không may, triển khai như vậy cho Android chưa có sẵn. Bắt đầu từ ICS, Android cung cấp API KeyChain bằng cách sử dụng ứng dụng có thể lưu mật khẩu cục bộ ở dạng an toàn. Các ứng dụng sử dụng API KeyChain rất hiếm, nhưng ứng dụng email chứng khoán sử dụng nó (Cảm ơn @wawa vì thông tin này). Vì vậy, mật khẩu của bạn sẽ an toàn với ứng dụng email stock miễn là màn hình của bạn bị khóa. Hãy nhớ rằng, KeyChain không an toàn nếu thiết bị đã được root và nó không khả dụng trên các thiết bị tiền ICS.


6
@JF Sebastian: thậm chí giả định rằng bạn hoàn toàn tin tưởng vào bên thứ ba lưu trữ mật khẩu của mình, những mật khẩu đó chỉ an toàn hơn một chút so với việc chỉ lưu trữ mật khẩu trong chính thiết bị. Thiết bị vẫn cần có thể truy xuất văn bản đơn giản của mật khẩu từ bộ lưu trữ đám mây và thiết bị vẫn phải lưu mật khẩu cục bộ vì bạn không muốn phải kết nối lại khóa của mình mỗi khi bạn vào đường hầm hoặc khu vực với tiếp nhận yếu. Điều tồi tệ nhất để làm trong bảo mật là cung cấp một cảm giác an toàn sai lầm.
Lie Ryan

4
@JFSebastian: kết luận, cách xác thực thực sự an toàn duy nhất là thực hiện những gì Google đã làm với ứng dụng Gmail, tức là sử dụng sơ đồ xác thực không chuẩn với mã thông báo xác thực. Ngay cả khi ai đó đã đánh cắp mã thông báo xác thực của bạn, bạn có thể vô hiệu hóa mã thông báo từ xa và bạn không cần thay đổi mật khẩu của mình vì bản rõ mật khẩu không bao giờ bị xâm phạm. Cách an toàn khác là sử dụng dongle mà không cần phiên; tốt, bạn biết điều gì xảy ra khi bạn làm điều đó, người dùng của bạn sẽ chỉ để lại khóa được gắn vĩnh viễn.
Lie Ryan

5
@JFSebastian: Tôi nghĩ bạn đang thiếu điểm. Mã hóa mật khẩu không an toàn hơn bất kỳ việc lưu trữ nó trong văn bản đơn giản, thậm chí không một bit. Bất kỳ kẻ tấn công nào quản lý để sao chép tài khoản.db cũng có thể sao chép khóa giải mã cùng với nó; điều duy nhất mà mã hóa mang lại cho bạn là cảm giác an toàn sai lầm , tệ hơn là không bảo mật. Vâng, có những giải pháp tốt hơn nhiều so với việc lưu trữ mật khẩu văn bản đơn giản, nhưng tất cả chúng đều yêu cầu thay đổi giao thức email, vì vậy chúng tôi phải sống với những gì chúng tôi hiện có. Hoặc thực hiện đúng cách theo cách không chuẩn như Gmail đã làm.
Lie Ryan

3
@JFSebastian Táo dịch vụ móc khóa hoặc dịch vụ được cung cấp bởi nhân Linux không phải là một tùy chọn an toàn hơn. Mật khẩu vẫn treo xung quanh trong bộ nhớ và nếu móc khóa được mở khóa thậm chí không được mã hóa. Vì vậy, nó chỉ có thể khó hơn một chút để lấy tệp .db gốc có thể đọc được. Google đã triển khai giải pháp khả thi tốt nhất có thể bằng cách sử dụng mã thông báo xác thực có thể bị vô hiệu trong trường hợp thiết bị bị xâm phạm. Tùy chọn an toàn hơn tiếp theo sẽ là nhập mật khẩu mỗi lần hoặc đơn giản là tránh sử dụng e-mail.
Lưu lượng

4
@LieRyan Kể từ ICS, ứng dụng Email chứng khoán thực sự sử dụng api KeyStore chứ không phải văn bản đơn giản. android-developers.blogspot.com/2012/03/ Mạnh
Wesley Wiser

12

Mật khẩu Android được sử dụng với ứng dụng Email tích hợp được lưu trữ dưới dạng văn bản đơn giản bên trong Cơ sở dữ liệu SQLite. Điều này trái ngược với ứng dụng Gmail , sử dụng Mã xác thực Auth như được mô tả trong câu trả lời của Sachin Sekhar .

Đối với Jelly Bean, vị trí cơ sở dữ liệu là:

/data/system/users/0/accounts.db

Vị trí trên thay đổi theo phiên bản Android

Vị trí này trên thiết bị chưa root được Hệ điều hành bảo mật và bảo vệ.
Trên các thiết bị đã root, người dùng đã bẻ khóa kỹ thuật bảo mật của chính họ và ngay cả khi nó không ở dạng văn bản đơn giản, nó vẫn sẽ không đáng để giải mã vì khóa phải tồn tại ở đâu đó trên thiết bị để thực hiện.

Một thành viên của Nhóm phát triển Android đã đăng một lời giải thích cho đến ngày hôm nay vẫn được áp dụng:

Bây giờ, đối với mối quan tâm đặc biệt này. Điều đầu tiên cần làm rõ là ứng dụng Email hỗ trợ bốn giao thức - POP3, IMAP, SMTP và Exchange ActiveSync - và với rất ít ngoại lệ, rất hạn chế, tất cả đều là các giao thức cũ yêu cầu khách hàng xuất trình mật khẩu cho máy chủ trên mọi kết nối. Các giao thức này yêu cầu chúng tôi giữ lại mật khẩu miễn là bạn muốn sử dụng tài khoản trên thiết bị. Các giao thức mới hơn không làm điều này - đây là lý do tại sao một số bài viết tương phản với Gmail chẳng hạn. Các giao thức mới hơn cho phép khách hàng sử dụng mật khẩu một lần để tạo mã thông báo, lưu mã thông báo và loại bỏ mật khẩu.

Tôi đề nghị bạn xem lại bài viết được liên kết trong bình luận # 38 , được viết tốt và khá nhiều thông tin. Nó cung cấp một số nền tảng rất tốt về sự khác biệt giữa các mật khẩu "che khuất" và làm cho chúng thực sự "an toàn". Chỉ cần che khuất mật khẩu của bạn (ví dụ: base64) hoặc mã hóa nó bằng một khóa được lưu trữ ở nơi khác sẽ không làm cho mật khẩu hoặc dữ liệu của bạn an toàn hơn. Kẻ tấn công vẫn có thể lấy nó.

(Đặc biệt, một số khiếu nại đã được đưa ra về một số ứng dụng email khác không lưu mật khẩu trong Cleartext. Ngay cả khi điều này là đúng, nó không chỉ ra rằng mật khẩu an toàn hơn. Một thử nghiệm đơn giản: nếu bạn có thể khởi động thiết bị và nó sẽ bắt đầu nhận email trên các tài khoản được định cấu hình của bạn, sau đó mật khẩu không thực sự an toàn. Chúng bị che khuất hoặc được mã hóa bằng một khóa khác được lưu trữ ở một nơi khác.)

Thông thường, vì vấn đề này dường như làm phiền nhiều người dùng Android, bạn cũng có thể theo dõi cuộc thảo luận này tại Slashdot - Dữ liệu mật khẩu Android được lưu trữ trong văn bản thuần túy .


Ồ Điều đó làm tôi ngạc nhiên. Tôi đã không nhận thức được thực tế rằng nó được lưu trữ trong văn bản đơn giản. Quên gốc hoặc không root. Nếu thiết bị của bạn bị đánh cắp, một người vô đạo đức có thể dễ dàng lấy được thông tin đăng nhập của bạn ngay cả khi bạn khóa điện thoại bằng khóa bảo mật. Với thực tế này, bạn cũng biết về bất kỳ cơ chế mã hóa rộng đĩa nào.
asudhak

1
Dù chúng là gì, chúng là thứ có thể được sử dụng để có quyền truy cập vào tài khoản. Nhưng, @SachinShekhar, accounts.dbtệp được bảo vệ khỏi bị đọc bởi các tài khoản khác ngoài system.
Wyzard

1
Zuul, tôi đánh giá cao nỗ lực của bạn, bạn đưa ra câu trả lời nhưng tôi nghĩ câu trả lời này rất sai lệch. Nếu bạn xem lại trích dẫn bạn đã trích dẫn lại, ứng dụng Gmail sẽ không lưu mật khẩu. --edit kiểm tra @SachinShekhar trả lời quá.
roxan

2
@asudhak Nếu bất kỳ ứng dụng nào đang sử dụng mật khẩu gốc, KHÔNG có cách nào để bảo vệ nó. Một tin tặc có thể giải mã chuỗi được mã hóa từ tài khoản.db sau khi tìm thấy khóa mã hóa / băm cần được lưu trữ cục bộ vì ứng dụng email sẽ cần khóa này để biên dịch mật khẩu gốc trước khi gửi nó đến máy chủ.
Android Quesito

2
@roxan Tôi không thể tìm thấy bất cứ thứ gì trỏ đến mật khẩu không được lưu trữ bởi ứng dụng Gmail. Bạn có thể cung cấp một trích dẫn hoặc một liên kết?
Lưu lượng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.