Tìm hiểu về bảo mật trên Android

Tăng cường bảo mật ứng dụng bằng các sandbox, việc ký ứng dụng và các quyền hạn

Khi bạn phát triển các ứng dụng Android, bạn phải giải quyết một số khía cạnh liên quan đến bảo mật, bao gồm cả các quy trình ứng dụng và các hộp cát (sandbox - hộp dùng để thử nghiệm và phát triển phần mềm), chia sẻ mã và dữ liệu, bảo vệ hệ thống thông qua việc ký các ứng dụng và sử dụng các quyền hạn. Hãy làm nổi bật những khía cạnh của bảo mật trong việc phát triển ứng dụng Android khi bạn làm việc với mã mẫu.

Tổng quan

Android bao gồm một khung phát triển, các thư viện ứng dụng và một máy ảo thời gian thực Dalvik, tất cả chạy trên Linux®. Bằng cách lợi dụng nhân Linux, Android có được một số trong các dịch vụ của hệ điều hành, bao gồm việc quản lý các tiến trình và bộ nhớ, một ngăn xếp mạng, các trình điều khiển thiết bị, một tầng trừu tượng hóa phần cứng, và, có liên quan đến chủ đề của bài viết này, các dịch vụ bảo mật.

Các từ viết tắt thường dùng

  • ADT: Android Development Tools - Các công cụ phát triển Android.
  • API: Application program interface - Giao diện lập trình ứng dụng.
  • IDE: Integrated development environment - Môi trường phát triển tích hợp.
  • JDK: Java Development Kit - Bộ dụng cụ phát triển Java.
  • URL: Uniform Resource Identifier - Trình nhận dạng tài nguyên thống nhất.
  • XML: Extensible Markup Language - Ngôn ngữ đánh dấu mở rộng.

Các điều kiện cần có trước

Để đồng hành cùng bài viết này, bạn cần những kỹ năng và các công cụ sau đây:

  • Kiến thức cơ bản về công nghệ Java™ và cách sử dụng Eclipse (hoặc IDE yêu thích của bạn).
  • JDK (phiên bản cần thiết là 5 hoặc 6).
  • Eclipse (phiên bản 3.4 hoặc 3.5).
  • SDK Android và Trình cắm thêm ADT.

Để tải về và có các thông tin thiết lập, hãy xem phần Tài nguyên ở cuối bài viết này.


Các hộp cát, các tiến trình và các quyền hạn

Mã định danh (ID) người dùng: Linux so với Android

Android sử dụng khái niệm về hộp cát để bắt buộc tách riêng giữa ứng dụng với nhau và các quyền hạn để cho phép hoặc ngăn không cho một ứng dụng truy cập vào các tài nguyên của thiết bị như các tệp và các thư mục, các mạng, các cảm biến và các API nói chung. Về việc này, Android sử dụng các phương tiện của Linux như bảo mật cấp-xử lý, các ID của người dùng và của nhóm có liên quan đến ứng dụng và các quyền hạn để bắt tuân thủ những hoạt động nào mà một ứng dụng được phép thực hiện.

Về khái niệm, một hộp cát có thể được thể hiện như trong Hình 1.

Hình 1. Hai ứng dụng Android, mỗi ứng dụng ở trong hộp cát hoặc tiến trình cơ sở riêng của mình
Biểu đồ: Hai ứng dụng Android, mỗi ứng dụng ở trong hộp cát hoặc tiến trình cơ sở riêng của mình với các ID người dùng khác nhau)

Các ứng dụng Android chạy trên tiến trình Linux riêng của mình và được gán cho một ID của người dùng duy nhất. Theo mặc định, các ứng dụng chạy trong một tiến trình của hộp cát cơ sở không được gán cho các quyền hạn, do đó ngăn không cho các ứng dụng như vậy được truy cập vào hệ thống hoặc các tài nguyên. Tuy nhiên, các ứng dụng Android có thể yêu cầu các quyền hạn thông qua các tệp bản kê (manifest) của ứng dụng.

Các ứng dụng Android có thể cho phép các ứng dụng khác truy cập vào tài nguyên của chúng bằng cách:

  • Khai báo các quyền hạn-bản kê thích hợp.
  • Chạy trong cùng tiến trình với các ứng dụng tin cậy khác, do đó chia sẻ quyền truy cập vào dữ liệu và mã của chúng.

Cách sau được minh họa trong Hình 2.

Hình 2. Hai ứng dụng Android, chạy trên cùng một tiến trình
Biểu đồ: Hai ứng dụng Android, chạy trên cùng một tiến trình (với cùng một chữ ký số và cùng một ID người dùng Linux)

Các ứng dụng khác nhau có thể chạy trong cùng tiến trình này. Đối với cách tiếp cận này, trước tiên bạn phải ký các ứng dụng đó bằng cách sử dụng cùng một khóa riêng và sau đó bạn phải gán cho chúng cùng một ID người dùng Linux khi sử dụng tệp bản kê, bằng cách định nghĩa thuộc tính bản kê android:sharedUserId với cùng một giá trị/tên.


Các trường hợp sử dụng của nhà phát triển

Hình 3 minh họa một số các trường hợp sử dụng (use case) có liên quan đến bảo mật được tìm thấy khi bạn phát triển các ứng dụng Android.

Hình 3. Các lĩnh vực bảo mật hiện có khi lập trình các ứng dụng Android
Biểu đồ: Các lĩnh vực bảo mật hiện có khi lập trình các ứng dụng Android
  • Việc ký ứng dụng hoặc mã là quá trình tạo các khóa riêng và khóa công khai và các chứng chỉ khóa-công khai, ký và tối ưu hóa ứng dụng.
  • Các quyền hạn là một cơ chế bảo mật của nền tảng Android cho phép hoặc hạn chế ứng dụng truy cập vào các API và các tài nguyên hạn chế. Theo mặc định, các ứng dụng Android không được cấp các quyền hạn nào, làm cho chúng an toàn nhờ không cho phép chúng truy cập vào các API hoặc các tài nguyên được bảo vệ trên thiết bị. Các quyền hạn phải cần thiết, các quyền hạn tùy chỉnh được định nghĩa và các nhà cung cấp nội dung và tệp được bảo vệ. Hãy chắc chắn rằng bạn kiểm tra, tuân thủ và thu hồi các quyền hạn trong thời gian chạy.

Tiếp theo, hãy xem xét từng lĩnh vực bảo mật cụ thể hơn.


Việc ký ứng dụng

Tất cả các ứng dụng Android phải được ký. Việc ký ứng dụng hoặc mã là quá trình ký số một ứng dụng cụ thể bằng cách sử dụng một khóa riêng để:

  • Xác định tác giả của mã.
  • Phát hiện ra nếu các ứng dụng đã thay đổi.
  • Xây dựng sự tin cậy giữa các ứng dụng.

Căn cứ vào mối quan hệ tin cậy này, các ứng dụng có thể chia sẻ mã và dữ liệu theo cách an toàn.

Các ứng dụng đã ký bằng cách sử dụng cùng một chữ ký số có thể cho phép lẫn nhau các quyền hạn khác để truy cập các API dựa trên chữ ký và cũng có thể chạy trong cùng một tiến trình nếu chúng chia sẻ các ID người dùng, cho phép truy cập vào mã và dữ liệu của nhau.

Việc ký ứng dụng bắt đầu bằng cách tạo ra một cặp khóa riêng và khóa công khai và một chứng chỉ khóa-công khai có liên quan, cũng được biết là một chứng chỉ khoá-công khai.

Khi làm việc với các ứng dụng Android, bạn có thể xây dựng các ứng dụng trong chế độ chế độ gỡ lỗi (debug)chế độ phát hành (release-mode):

  • Các ứng dụng được xây dựng khi sử dụng các công cụ xây dựng Android (dòng lệnh và ADT của Eclipse) được tự động ký bằng cách sử dụng một khóa riêng gỡ lỗi; các ứng dụng này được gọi là các ứng dụng chế độ gỡ lỗi. Các ứng dụng chế độ gỡ lỗi được sử dụng để thử nghiệm và không nên được phân phối. Lưu ý rằng các ứng dụng chưa được ký hoặc các ứng dụng đã ký bằng cách sử dụng một khóa riêng gỡ lỗi không thể được phân phối thông qua Thị trường Android.
  • Khi bạn đã sẵn sàng để phát hành ứng dụng của mình, bạn phải xây dựng một phiên bản chế độ phát hành của nó, có nghĩa là ký ứng dụng đó bằng khóa riêng của bạn.

Việc ký mã trong Android được thực hiện theo một cách đơn giản hơn nhiều so với các nền tảng di động khác. Trong Android, chứng chỉ này có thể tự ký, có nghĩa là, không cần phải có người có thẩm quyền chứng nhận. Cách tiếp cận này làm đơn giản hóa quá trình xuất bản và các chi phí liên quan.

Tiếp theo, tôi trình bày cách ký các ứng dụng Android thủ công từ dòng lệnh và ký bằng cách sử dụng ADT của Eclipse. Tôi không trình bày một cách tiếp cận thứ ba, sử dụng Ant, trong bài viết này.

Tạo thủ công các khóa riêng và khóa công khai và chứng chỉ khóa-công khai

Hãy nhớ rằng các ứng dụng chế độ gỡ lỗi được ký tự động bằng các công cụ xây dựng khi sử dụng khóa/chứng chỉ gỡ lỗi. Để ký một ứng dụng chế độ phát hành, trước tiên bạn phải tạo cặp khóa riêng và khóa công khai và chứng chỉ khóa-công khai. Bạn có thể ký ứng dụng của bạn bằng thủ công hoặc bằng cách sử dụng ADT của Eclipse. Trong cả hai cách tiếp cận, khóa của công cụ khóa của JDK (Java Developer Kit – Bộ dụng cụ của nhà phát triển Java) và tiện ích quản lý chứng chỉ được sử dụng.

Để tạo thủ công thông tin khóa riêng và khóa công khai, hãy sử dụng keytool từ dòng lệnh, như trong Liệt kê 1.

Liệt kê 1. Sử dụng keytool để tạo các khóa riêng/khóa công khai và chứng chỉ
keytool -genkey -v -alias <alias_name> -keystore <keystore.name> 
-keyalg RSA -keysize 2048 -validity <number of days>

LƯU Ý:Liệt kê 1 giả định JDK đã được cài đặt trên máy tính của bạn và đường dẫn JAVA_HOME được xác định đúng để trỏ đến thư mục JDK của bạn (xem phần Tài nguyên với các thông tin tải về và thiết lập).

Trong Liệt kê 1, -genkey biểu thị một mục nhập cặp khóa riêng và khóa công khai , cũng như một chuỗi của chứng chỉ X.509 v1 có một phần tử, tự ký bao gồm khóa công khai được tạo ra. -v biểu thị chế độ-dài dòng. -alias là bí danh để sử dụng cho mục nhập kho khóa (keystore) để lưu trữ khóa riêng và chứng chỉ được tạo. -keystore cho biết tên của kho khóa muốn sử dụng. -keyalg là thuật toán sử dụng để tạo ra cặp khoá. -keysize là kích thước của khóa để tạo ra, ở đây giá trị mặc định là 1024, nhưng khuyến khích sử dụng là 2048. Và -validity là thời hạn hiệu lực theo ngày; khuyến cáo sử dụng một giá trị lớn hơn 1000.

LƯU Ý: Sau khi bạn tạo ra các khóa của mình, điều rất quan trọng là bạn bảo vệ khóa riêng của bạn. Không chia sẻ khóa riêng và không chỉ rõ nó trên dòng lệnh hoặc trong các kịch bản lệnh; lưu ý rằng công cụ khóa (keytool) và trình ký jar (jarsigner) nhắc nhở mật khẩu. Về điều này và các thủ thuật khác, xem "Bảo vệ khóa riêng của bạn" từ trang web của các nhà phát triển Android (xem phần Tài nguyên để có một liên kết).

Keytool nhắc gõ tên và họ, tổ chức, thành phố, bang, quốc gia của bạn để từ đó tạo ra một Tên Nhận biết X.500 (xem phần Tài nguyên để biết thêm thông tin) và các mật khẩu để bảo vệ khóa riêng và để tự bảo vệ kho khóa.

Với thời hạn hiệu lực, đảm bảo chắc chắn sử dụng một thời hạn vượt quá vòng đời dự kiến của ứng dụng và các ứng dụng liên quan. Nếu bạn đang xuất bản ứng dụng của mình trên thị trường Android, thời hạn phải kết thúc sau 22 tháng 10 năm 2033; nếu không, bạn không thể tải nó lên. Ngoài ra, các chứng chỉ có vòng đời lâu dài làm cho bạn dễ dàng hơn khi nâng cấp các ứng dụng của bạn. May mắn thay, Thị trường Android đòi hỏi các chứng chỉ có vòng đời lâu dài để giúp bạn tránh các tình huống như vậy.

Ký thủ công ứng dụng của bạn

Tiếp theo, ký ứng dụng chưa ký bằng cách sử dụng công cụ jarsigner, một phần của JDK:

jarsigner -verbose -keystore <keystore.name> <my_application.apk> <alias_name>

Trong đoạn mã trên, -verbose cho biết chế độ dài và -keystore cho biết tên của kho khóa sử dụng. Tiếp theo là tên của ứng dụng (.apk) và cuối cùng là bí danh để sử dụng cho khóa riêng.

Jarsigner nhắc nhập mật khẩu để sử dụng kho khóa và khóa riêng.

Các ứng dụng có thể được ký nhiều lần bằng cách sử dụng các khóa khác nhau và các ứng dụng đã ký với cùng một khóa riêng có thể thiết lập một mối quan hệ tin cậy với nhau và có thể chạy trong cùng một tiến trình và chia sẻ mã và dữ liệu.

Tối ưu hóa ứng dụng của bạn bằng thủ công

Bước cuối cùng trong quá trình ký là tối ưu hóa ứng dụng này để cho các ranh giới của dữ liệu được sắp xếp trong bộ nhớ với sự bắt đầu của tệp, một kỹ thuật giúp cải thiện hiệu năng thời gian chạy và sử dụng bộ nhớ. Để sắp xếp ứng dụng, sử dụng zipalign:

zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk

Trong đoạn mã trên, -v biểu thị kết quả đầu ra dài. Số 4 cho biết sử dụng sự sắp xếp bốn-byte (luôn luôn sử dụng bốn byte). Đối số tiếp theo là tên tệp của ứng dụng đầu vào đã ký (.apk), ứng dụng đó phải được ký bằng khóa riêng của bạn và đối số cuối cùng là tên tệp kết quả đầu ra; nếu ghi đè một ứng dụng hiện có, hãy thêm vào -f.

Kiểm tra thủ công xem ứng dụng đã được ký chưa

Để kiểm tra xem ứng dụng được ký chưa, sử dụng Jarsigner, lúc này dùng cờ -verify:

jarsigner -verify -verbose -certs my_application.apk

Trong đoạn mã trên, -verify biểu thị việc kiểm tra ứng dụng; -verbose biểu thị chế độ dài dòng; -certs biểu thị sẽ hiển thị trường CN của những người đã tạo ra khóa và đối số cuối cùng là tên của gói ứng dụng Android cần kiểm tra.

LƯU Ý: Nếu CN là "Android Debug", có nghĩa là ứng dụng này đã được ký bằng cách sử dụng khóa gỡ lỗi và nó không thể được xuất bản; hãy nhớ sử dụng một khóa riêng nếu kế hoạch của bạn là xuất bản ứng dụng của mình trên Thị trường Android.

Đúng là bạn vừa thấy cách tạo thủ công các khóa riêng và khóa công khai và cách ký và tối ưu hóa ứng dụng này. Tiếp theo, hãy xem xét cách sử dụng ADT (Các công cụ phát triển Android) của Eclipse để tự động tạo các khóa riêng và khóa công khai và cách ký và tối ưu hóa ứng dụng cho bạn.


Sử dụng ADT của Eclipse để tạo các khóa và chứng chỉ và để ký và tối ưu hóa các ứng dụng của bạn

Để tạo các khóa khi sử dụng ADT của Eclipse, bạn phải xuất khẩu ứng dụng này. Có hai phương thức xuất khẩu các ứng dụng từ Eclipse:

  • Xuất khẩu một phiên bản chưa ký của ứng dụng mà bạn phải ký thủ công.
  • Xuất khẩu một phiên bản đã ký của ứng dụng, ở đây ADT sẽ làm tất cả các bước cho bạn.

Xuất khẩu một ứng dụng chưa ký

Bạn có thể xuất khẩu một phiên bản ứng dụng chưa ký của bạn mà bạn phải ký thủ công ứng dụng đó. Đó là, bạn cần phải chạy thủ công keytool (để tạo ra các khóa như được mô tả ở trên) và Jarsigner (để ký ứng dụng) và tối ưu hóa ứng dụng bằng cách sử dụng công cụ zipalign, như đã giải thích ở trên.

Để xuất khẩu một phiên bản ứng dụng chưa ký bằng cách sử dụng ADT, hãy nhấn chuột phải vào dự án đó và chọn Android Tools>Export Unsigned Application Package (Các công cụ Android > Xuất khẩu gói ứng dụng chưa ký) (xem Hình 4).

Hình 4. Xuất khẩu ứng dụng chưa ký
Ảnh chụp màn hình về xuất khẩu ứng dụng chưa ký

Sau khi được chọn, ADT nhắc bạn về thư mục, nơi xuất khẩu ứng dụng chưa ký. Hãy nhớ rằng ngay khi ứng dụng được xuất khẩu, bạn phải ký và tối ưu hóa thủ công ứng dụng đó, như đã trình bày ở trên.

Xuất khẩu một ứng dụng đã ký

Với ADT của Eclipse, bạn có thể xuất khẩu một phiên bản ứng dụng đã ký. Khi sử dụng cách tiếp cận này, ADT nhắc cho bạn những việc sau:

  • Thông tin cần thiết để sử dụng một kho khóa hiện có hoặc tạo ra một kho khóa được bảo vệ mới.
  • Thông tin cần thiết để tạo ra một khóa riêng được bảo vệ.
  • Thông tin cần thiết để tạo ra chứng chỉ khoá-công khai.

Để xuất khẩu một ứng dụng đã ký, nhấn chuột phải vào dự án đó, nhưng lần này chọn mục trình đơn Android Tools->Export Signed Application Package (Các công cụ Android > Xuất khẩu gói ứng dụng đã ký), như minh họa trong Hình 5.

Hình 5. Xuất khẩu một ứng dụng đã ký
Ảnh chụp màn hình về xuất khẩu ứng dụng đã ký

Vào lúc này này, Trình thủ thuật xuất khẩu (Export Wizard) hoạt động, như trong Hình 6.

Hình 6. Trình thủ thuật xuất khẩu
Ảnh chụp màn hình về trình thủ thuật xuất khẩu

Trong Hình 7, hãy chọn một kho khóa hiện có hoặc tạo một kho khóa mới và các ủy quyền để sử dụng.

Hình 7. Trình thủ thuật xuất khẩu: Chọn kho khóa
Ảnh chụp màn hình về trình thủ thuật xuất khẩu: Chọn kho khóa

Trong Hình 8, hãy nhập thông tin để tạo ra khóa riêng và chứng chỉ số.

Hình 8. Trình thủ thuật xuất khẩu: Tạo khóa riêng và chứng chỉ số
Ảnh chụp màn hình về trình thủ thuật xuất khẩu: chọn dự án để xuất khẩu

Trong Hình 9, hãy nhập đường dẫn và tên của tệp đích và kiểm tra thời hạn hiệu lực.

Hình 9. Nhập đường dẫn và tên của tệp đích
Ảnh chụp màn hình về nhập vào đường dẫn và tên cho tệp đích

Khi hoàn thành, bạn có một ứng dụng chế độ-phát hành đã ký và được tối ưu hóa có thể xuất bản được.

Ngoài ra, bạn cũng có thể gọi Export Wizard bằng cách sử dụng Android Manifest Tool (Công cụ Manifest của Android), như trong Hình 10.

Hình 10. Gọi Export Wizard bằng cách sử dụng công cụ Manifest Android
Ảnh chụp màn hình về gọi trình thủ thuật xuất khẩu bằng công cụ Android Manifest

Sau khi ứng dụng được ký, bước tiếp theo là để bạn xác định các quyền hạn mà ứng dụng đó cần đến trong bản kê. Quá trình này được mô tả tiếp sau.

Lưu ý rằng trang web của nhà phát triển Android có nhiều tài liệu thú vị về việc ký ứng dụng, nó luôn cập nhật khi các bản phát hành mới của nền tảng Android trở nên có sẵn (xem phần Tài nguyên để biết thêm thông tin).


Sử dụng các quyền hạn

Các quyền hạn là một cơ chế bảo mật của nền tảng Android để cho phép hoặc hạn chế ứng dụng truy cập đến các API và các tài nguyên bị hạn chế. Theo mặc định, các ứng dụng Android không được cấp các quyền hạn nào, làm cho chúng an toàn bằng cách không cho phép chúng truy cập vào các API được bảo vệ hoặc các tài nguyên trên thiết bị. Ứng dụng phải yêu cầu các quyền hạn thông qua tệp bản kê và người dùng cấp hoặc không cấp các quyền hạn trong khi cài đặt.

Android định nghĩa một danh sách dài các quyền hạn qua bản kê, bảo vệ các khía cạnh khác nhau của hệ thống hoặc các ứng dụng khác. Để yêu cầu cấp quyền hạn, hãy khai báo một thuộc tính <user-permission> trong tệp bản kê:

<uses-permission android:name="string" />

Ở đây android:name xác định tên của quyền hạn này.

Để biết một danh sách tất cả các quyền hạn qua bản kê do Android định nghĩa, hãy xem trang Manifest.permisson. Liệt kê 2 là một ví dụ của một tệp bản kê yêu cầu cấp quyền sử dụng Internet và quyền ghi vào bộ nhớ ngoài:

Liệt kê 2. Khai báo (yêu cầu cấp) một quyền hạn
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      android:versionCode="1"
      android:versionName="1.0"
      package="com.cenriqueortiz.tutorials.datastore" 
      android:installLocation="auto">

    <application 
        :
        :
        :
    </application>

    <uses-permission 
        android:name="android.permission.INTERNET"/>
    <uses-permission 
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>

Các ứng dụng có thể định nghĩa các quyền hạn tùy chỉnh riêng của mình để bảo vệ tài nguyên của ứng dụng. Các ứng dụng khác muốn truy cập vào tài nguyên được bảo vệ của một ứng dụng phải yêu cầu có các quyền hạn thích hợp thông qua tệp bản kê riêng của mình. Liệt kê 3 chỉ ra một ví dụ về cách định nghĩa các quyền hạn.

Liệt kê 3. Khai báo một quyền hạn tùy chỉnh
<permission
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:name="com.cenriqueortiz.android.ACCESS_FRIENDS_LIST"
        android:description="@string/permission_description"
        android:label="@string/permission_label"
        android:protectionLevel="normal"
    >
</permission>

Trong Liệt kê 3, một quyền hạn khách hàng được định nghĩa bằng cách xác định các thuộc tính tối thiểu name (tên), description (mô tả), label (nhãn) và protectionLevel (mức bảo vệ). Các thuộc tính khác có thể được định nghĩa thêm, nhưng chúng không được trình bày ở đây.

Một thuộc tính cần quan tâm đặc biệt là android:protectionLevel, biểu thị phương thức mà hệ thống phải tuân theo khi cấp (hoặc không cấp) một quyền hạn cho một ứng dụng đang yêu cầu. Các mức bảo vệ gồm có normal (bình thường), nghĩa là tự động cấp các quyền này (mặc dù người sử dụng luôn có thể xem xét lại trước khi cài đặt), việc cấp các quyền hạn dựa trên chữ ký (có nghĩa là, nếu ứng dụng đang yêu cầu đã được ký với cùng một chứng chỉ) và dangerous (nguy hiểm), biểu thị các quyền hạn truy cập đến dữ liệu riêng hoặc có tác động tiêu cực tiềm năng khác. Để biết thêm thông tin về thuộc tính bản kê <permission> hãy xem trang <permission> (xem phần Tài nguyên).

Các ứng dụng có thể hạn chế truy cập vào ứng dụng và các thành phần hệ thống mà nó sử dụng như là Activity (Hoạt động), Service (Dịch vụ), Content Provider (Nhà cung cấp nội dung) và Broadcast Receiver (Máy thu quảng bá). Sự hạn chế này dễ dàng thực hiện bằng cách định nghĩa thuộc tính android:permission như trong Liệt kê 4. Mức bảo vệ này để cho ứng dụng đó cho phép hoặc hạn chế các ứng dụng khác truy cập vào tài nguyên hệ thống.

Liệt kê 4. Định nghĩa một quyền hạn cho một hoạt động
<activity 
    android:name=".FriendsListActivity" 
    android:label="Friends List">
    android:permission="com.cenriqueortiz.android.ACCESS_FRIENDS_LIST"
    <intent-filter>
        :
        :
    </intent-filter>        
</activity>

Các quyền hạn của các nhà cung cấp nội dung và của tệp

Các nhà cung cấp nội dung trưng ra một URI chung là URI duy nhất xác định dữ liệu của họ (xem phần Tài nguyên). Để bảo vệ các nhà cung cấp nội dung như vậy, khi bắt đầu một hoạt động hoặc trả về một kết quả hoạt động của mình, người gọi có thể thiết lập Intent.FLAG_GRANT_READ_URI_PERMISSIONIntent.FLAG_GRANT_WRITE_URI_PERMISSION, để cấp quyền cho hoạt động thu nhận truy cập vào URI của dữ liệu cụ thể theo ý đích này.

Theo mặc định, các tệp của ứng dụng được bảo vệ. Các tệp được bảo vệ dựa trên các ID người dùng và do đó chỉ người chủ sở hữu của ứng dụng, có cùng ID người dùng, mới có thể truy cập được. Như đã trình bày ở trên, các ứng dụng chia sẻ ID người dùng giống nhau (và được ký bằng cách sử dụng cùng một chứng chỉ số) chạy trên cùng một tiến trình và vì thế chia sẻ quyền truy cập các ứng dụng của chúng.

Các ứng dụng có thể cho phép các ứng dụng hoặc các tiến trình khác có quyền truy cập tới các tệp của mình. Sự cho phép này được thực hiện bằng cách chỉ ra chế độ hoạt động MODE_WORLD_READABLEMODE_WORLD_WRITEABLE thích hợp để cho phép quyền truy cập đọc hoặc viết vào tệp, hoặc MODE_PRIVATE để mở tệp trong chế độ riêng tư. Bạn có thể xác định một chế độ hoạt động bằng các phương thức sau khi bạn tạo hoặc mở các tệp:

  • getSharedPreferences(filename, operatingMode)
  • openFileOutput(filename, operatingMode)
  • openOrCreateDatabase(filename, operatingMode, SQLiteDatabase.CursorFactory)

Các API Permission thời gian chạy

Android cung cấp các API để kiểm tra, bắt tuân thủ, cấp và thu hồi các quyền hạn trong thời gian chạy. Các API này là một phần của lớp android.content.Context, cung cấp toàn bộ thông tin về một môi trường ứng dụng. Ví dụ, nếu bạn muốn xử lý các quyền hạn một cách trang nhã, bạn có thể xác định xem ứng dụng của bạn đã được cấp quyền truy cập vào Internet chưa (xem Liệt kê 5).

Liệt kê 5. Sử dụng một API Permission thời gian chạy để kiểm tra, bắt tuân thủ, cấp và thu hồi các quyền hạn trong thời gian chạy
if (context.checkCallingOrSelfPermission(Manifest.permission.INTERNET)
        != PackageManager.PERMISSION_GRANTED) {
            // The Application requires permission to access the  
            // Internet");
} else {
    // OK to access the Internet
}

Đối với các API quyền hạn khác để kiểm tra, bắt tuân thủ, cấp và thu hồi các quyền hạn trong thời gian chạy, hãy xem lớp ngữ cảnh.


Kết luận

Bài viết này đã giới thiệu bảo mật trên nền tảng Android, bao gồm các hộp cát, việc ký ứng dụng, các quyền hạn của ứng dụng và các quyền hạn của nhà cung cấp nội dung và tệp. Sau phần mở đầu này, bạn có thể tạo các chứng chỉ số bằng thủ công và sử dụng Eclipse, yêu cầu cấp các quyền hạn cho các ứng dụng và cho phép hoặc không cho phép các ứng dụng truy cập tới các nhà cung cấp nội dung và các tệp. Ngoài ra, bạn xem xét nhanh các API thời gian chạy của các quyền hạn, cho phép bạn kiểm tra, bắt tuân thủ, cấp và thu hồi các quyền hạn trong thời gian chạy.

Tài nguyên

Học tập

  • Android là gì?: Tìm hiểu tổng quan từ trang web của các nhà phát triển Android.
  • Phát triển các ứng dụng Android với Eclipse (Frank Ableson,developerWorks, 02.2008): Tìm hiểu tất cả về cách dễ dàng nhất để phát triển các ứng dụng Android là sử dụng Eclipse trong hướng dẫn này.
  • Giới thiệu về phát triển Android (Frank Ableson, developerWorks, 05.2009): Xem phần mở đầu về nền tảng Android và tìm hiểu cách mã hóa một ứng dụng Android cơ bản.
  • Các chứng chỉ X.509: Tìm hiểu tiêu chuẩn X.509, định nghĩa thông tin nào có thể có trong một chứng chỉ và mô tả cách ghi nó (định dạng dữ liệu).
  • Các quyền hạn mở rộng: Yêu cầu các quyền hạn mở rộng cho ứng dụng của bạn khi ứng dụng cần phải truy cập vào các phần khác của hồ sơ người dùng có thể có tính riêng tư hoặc khi ứng dụng cần phải xuất bản nội dung đến Facebook nhân danh người dùng.
  • Bảo vệ khóa riêng của bạn: Tìm hiểu cách giữ bảo mật khóa riêng của bạn trên trang web của các nhà phát triển Android.
  • Việc ký các ứng dụng của bạn: Tìm hiểu về việc ký các ứng dụng Android của bạn trước khi xuất bản chúng cho những người sử dụng di động từ trang web của các nhà phát triển Android.
  • Trang manifest.permission: Để tìm danh sách tất cả các quyền hạn qua Manifest do Android định nghĩa, hãy truy cập vào trang web các nhà phát triển Android.
  • Các nhà cung cấp nội dung: Tìm hiểu cách lưu trữ và lấy ra dữ liệu và làm cho tất cả các ứng dụng có thể truy cập vào nó.
  • Lớp Context (Bối cảnh): Cho phép truy cập đến các tài nguyên và các lớp ứng dụng cụ thể với giao diện này để toàn bộ thông tin được mô tả trên trang web của các nhà phát triển Android.
  • Nối mạng với Android (Frank Ableson, developerWorks, 06.2009): Tìm hiểu các khả năng nối mạng của Android.
  • Làm việc với XML trên Android (Michael Galpin, developerWorks, 06.2009): Tìm hiểu về các tùy chọn khác nhau để làm việc với XML trên Android và cách sử dụng chúng để xây dựng các ứng dụng của Android riêng của bạn.
  • Dưới Mái che của các ứng dụng Web được thiết kế riêng cho Android: Tìm hiểu về các ứng dụng lai trong Android.
  • Mở khóa Android (Frank Ableson, Manning Publications, 2010): Trình bày tất cả các khía cạnh về phát triển Android trong cuốn sách này của tác giả.
  • Thiết kế và Phát triển di động (Brian Fling, O'Reilly Media, 2009): Tìm hiểu về các hướng dẫn thực hành, các tiêu chuẩn, các kỹ thuật và các thực hiện tốt nhất để xây dựng các sản phẩm di động trong cuốn sách này.
  • Đọc Hướng dẫn phát triển lưu trữ dữ liệu: Chọn giải pháp đúng để lưu dữ liệu ứng dụng lâu bền như được lưu ý trên trang web chính thức của nhà phát triển Android.
  • Intents: Tìm hiểu về mô tả trừu tượng này của một hoạt động được thực hiện từ trang web của nhà phát triển Android.
  • Tài liệu SDK của Android: Thu thập các thông tin mới nhất trong tài liệu tham khảo API của Android.
  • The Open Handset Alliance: Truy cập vào trang web của nhà tài trợ của Android.
  • Vùng XML trên developerWorks: Thu thập các tài nguyên mà bạn cần để nâng cao các kỹ năng của bạn trong lĩnh vực XML.
  • My developerWorks: Cá nhân hoá kinh nghiệm developerWorks của bạn.
  • Chứng chỉ XML của IBM: Tìm hiểu cách bạn có thể trở thành một nhà phát triển có chứng chỉ-IBM trong công nghệ XML và các công nghệ liên quan.
  • Thư viện kỹ thuật XML: Xem Vùng XML của developerWorks với một loạt các bài báo và thủ thuật kỹ thuật, các hướng dẫn, các tiêu chuẩn và các sách Đỏ của IBM. Ngoài ra, hãy xem chi tiết các thủ thuật XML.
  • Các sự kiện kỹ thuật và Webcast của developerWorks: Theo sát với công nghệ trong các phiên này.
  • developerWorks trên Twitter: Tham gia ngày hôm nay để theo sát các bài viết ngắn (tweets) của developerWorks.
  • developerWorks podcasts: Nghe các cuộc phỏng vấn và các cuộc thảo luận thú vị dành cho các nhà phát triển phần mềm.
  • Các chương trình trình diễn theo yêu cầu của developerWorks: Xem một loạt các chương trình trình diễn từ cài đặt và thiết lập sản phẩm cho nhưng người mới bắt đầu đến chức năng cao cấp cho các nhà phát triển có kinh nghiệm.

Lấy sản phẩm và công nghệ

  • Trang <permission>: Tìm thêm thông tin về trang Manifest <permission>.
  • keytool: Hãy thử công cụ quản lý khóa và chứng chỉ này.
  • jarsigner: Nhận công cụ ký JAR và xác nhận hợp lệ này để tạo các chữ ký cho các tệp lưu trữ Java (JAR) và xác nhận các chữ ký của các tệp JAR đã ký.
  • Android SDK: Tải về SDK, truy cập tài liệu tham khảo API và nhận các tin tức mới nhất về Android từ trang Web chính thức của nhà phát triển Android. Phiên bản 1.5 và mới hơn sẽ hoạt động.
  • Dự án nguồn mở Android: Tìm các thông tin nguồn mở và mã nguồn mà bạn cần để xây dựng một thiết bị tương thích với Android.
  • Bản cập nhật 21 của JDK 6: Nhận nền tảng Java, ấn bản tiêu chuẩn.
  • Eclipse: Nhận lấy bản IDE của Eclipse mới nhất.
  • Các phiên bản đánh giá sản phẩm của IBM: Tải về hoặc khám phá các thử nghiệm trực tuyến trong SOA Sandbox của IBM và nhận các công cụ phát triển ứng dụng thực hành của bạn và các sản phẩm phần mềm trung gian từ DB2®, Lotus®, Rational®, Tivoli® và WebSphere®.

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Nguồn mở
ArticleID=648324
ArticleTitle=Tìm hiểu về bảo mật trên Android
publish-date=04222011