+1

Làm thế nào để bảo mật một ứng dụng Android

Giới thiệu

Hệ điều hành Android đã có rất nhiều tính năng bảo mật tích hợp, chẳng hạn như sandboxing, bảo vệ chống lại đệm và tràn số nguyên các cuộc tấn công, và các khu vực bộ nhớ được tách riêng để được hướng dẫn chương trình và dữ liệu. Kết quả là, các ứng dụng Android đơn giản mà không thực hiện bất kỳ hệ thống tập tin hoặc các hoạt động kết nối mạng thường có thể được coi là an toàn theo mặc định.

Nếu bạn đang phát triển một ứng dụng phức tạp hơn, tất nhiên , đó là trách nhiệm của bạn để làm cho nó an toàn và bảo vệ sự riêng tư của người dùng của bạn. Trong bài viết này, tôi sẽ liệt kê một số các thực hành tốt nhất mà bạn có thể làm theo để xây dựng một ứng dụng Android an toàn mà không bị rò rỉ dữ liệu hoặc cho phép, và, nói chung, ít bị các ứng dụng độc hại có thể được cài đặt trên thiết bị của người dùng.

1.Sử dụng nội bộ lưu trữ cho dữ liệu nhạy cảm

Mỗi ứng dụng Android có một thư mục lưu trữ nội bộ liên kết với nó có con đường được dựa trên tên gói ứng dụng. Tập tin bên trong thư mục này là rất an toàn vì họ sử dụng các chế độ tạo file MODE_PRIVATE theo mặc định. Điều này có nghĩa các tập tin không thể được truy cập bởi bất kỳ ứng dụng khác trên thiết bị. Vì vậy, nó là một nơi tốt nhất để lưu trữ tất cả các dữ liệu nhạy cảm của ứng dụng của bạn trong thư mục lưu trữ nội bộ.

Để xác định đường dẫn tuyệt đối của thư mục lưu trữ nội bộ của ứng dụng của bạn, khuyên bạn nên sử dụng phương pháp getFilesDir (). Một khi bạn biết đường đi của nó, tham khảo các tập tin bên trong nó cũng đơn giản như tham khảo các tập tin bên trong thư mục nào khác.

Ví dụ, đây là cách bạn có thể tham khảo một tập tin gọi là myfile.dat trong thư mục lưu trữ nội bộ của ứng dụng của bạn:

File myFile = new File(getFilesDir(), "myfile.dat");

2. Mã hóa dữ liệu trên bộ nhớ ngoài

Dung lượng lưu trữ nội bộ của một thiết bị Android thường bị hạn chế. Vì vậy, vào những thời điểm, bạn có thể không có sự lựa chọn nhưng để lưu trữ dữ liệu nhạy cảm trên phương tiện truyền thông lưu trữ bên ngoài, chẳng hạn như là một thẻ SD có thể tháo rời.

Bởi vì dữ liệu trên thiết bị lưu trữ bên ngoài có thể được truy cập trực tiếp bởi cả người dùng và các ứng dụng khác trên thiết bị, điều quan trọng là bạn lưu nó trong một định dạng mã hóa. Một trong những thuật toán mã hóa phổ biến nhất được sử dụng bởi các nhà phát triển hiện nay là AES, viết tắt của Advanced Encryption Standard, với kích thước khóa 256 bit.

Viết mã để mã hóa và giải mã dữ liệu của ứng dụng của bạn bằng cách sử dụng gói javax.crypto, được tích hợp trong Android SDK, có thể gây nhầm lẫn. Do đó, hầu hết các nhà phát triển thích sử dụng thư viện của bên thứ ba, chẳng hạn như thư viện Facebook's Conceal, thường là dễ dàng hơn để làm việc hơn.

3. Sử dụng Intents cho IPC

Những lập trình viên giàu kinh nghiệm mà mới phát triển ứng dụng Android thường cố gắng sử dụng sockets, hoặc các tập tin chia sẻ để đồng bộ giao tiếp với các ứng dụng khác được cài đặt trên thiết bị Android. Những cách tiếp cận không chỉ là khó khăn và không thanh nha, nhưng cũng dễ bị đe dọa. Một cách tiếp cận dễ dàng hơn và an toàn hơn để giao tiếp interprocess trên hệ điều hành Android là sử dụng Intent.

Để gửi dữ liệu đến một thành phần cụ thể của một ứng dụng, bạn phải tạo một thể hiện mới của lớp Intent và sử dụng phương thức của nó setComponent () để xác định cả hai tên gói ứng dụng và tên của các thành phần. Sau đó bạn có thể thêm dữ liệu vào nó bằng cách sử dụng phương thức putExtra ().

Ví dụ, đây là cách bạn có thể gửi các chuỗi Hello World cho một Activity được gọi là MyActivity, mà thuộc về một ứng dụng có packagename là my.other.app:

// Create an intent
Intent intent = new Intent();

// Specify the component name
intent.setComponent(
    new ComponentName("my.other.app","my.other.app.MyActivity")
);

// Add data
intent.putExtra("DATA", "Hello World!");

// Send the intent to the activity
startActivity(intent);

Để gửi dữ liệu cho nhiều ứng dụng cùng một lúc, bạn có thể gửi các Intent như một broadcast bằng cách sử dụng phương thức sendBroadcast (). Tuy nhiên, theo mặc định, một Broadcast có thể được đọc bởi bất kỳ ứng dụng có BroadcastReceiver cấu hình thích hợp.

Vì vậy, nếu bạn muốn gửi thông tin nhạy cảm như một broadcast, bạn phải sử dụng một sự cho phép tùy chỉnh mà protectionLevel được thiết lập để chữ ký. Bằng cách làm như vậy, hệ điều hành Android bảo đảm rằng chỉ các ứng dụng được ký kết sử dụng phím ký của bạn có thể nhận được phát sóng.

Dưới đây là một đoạn mã đó cho bạn thấy làm thế nào để gửi chuỗi Hello World là một broadcast an toàn:

// Create an intent
Intent intent = new Intent();

// Add data
intent.putExtra("DATA", "Hello World");

// Specify an action name for
// the receiver's intent-filter
intent.setAction("my.app.receive");

// Send as a broadcast using a custom permission
sendBroadcast(intent, "my.custom.permission");

Lưu ý rằng các mã trên hoạt động như mong đợi chỉ khi được sự cho phép tùy chỉnh được khai báo và sử dụng trong các tập tin manifest của cả người gửi và người nhận ứng dụng.

<permission android:name="my.custom.permission"
    android:protectionLevel="signature"/>
<uses-permission android:name="my.custom.permission"/>

4. Sử dụng HTTPS

Tất cả các thông tin liên lạc giữa các ứng dụng của bạn và server của bạn phải qua một kết nối HTTPS, tốt nhất sử dụng các lớp HttpsURLConnection. Nếu bạn nghĩ rằng sử dụng HTTP cho dữ liệu đó không phải là bí mật là tốt, hãy nghĩ lại.

Nhiều người dùng Android kết nối với nhiều các hotspot Wi-Fi ở khu vực công cộng mỗi ngày. Một số trong những hotspot có thể là độc hại. Một điểm nguy hiểm có thể dễ dàng thay đổi nội dung của giao thức HTTP để làm cho ứng dụng của bạn cư xử một cách bất ngờ, hoặc tệ hơn nữa, bơm quảng cáo hoặc khai thác vào nó.

Bằng cách sử dụng HTTPS, miễn là các máy chủ được cấu hình với một giấy chứng nhận do cơ quan chứng nhận đáng tin cậy như DigiCert hoặc GlobalSign, bạn có thể chắc chắn rằng lưu lượng mạng của bạn an toàn chống lại cả hai nghe trộm và các cuộc tấn công man-in-the-middle.

Nếu ứng dụng của bạn có rất nhiều mã mạng và bạn sợ rằng bạn có thể vô tình được gửi một số dữ liệu như cleartext, bạn nên xem xét sử dụng nogotofail, một công cụ mã nguồn mở được xây dựng bởi Google để tìm sai lầm như vậy.

5. Sử dụng GCM thay cho SMS

Quay lại khi GCM, viết tắt của Google Cloud Messaging, chưa ra đời, nhiều nhà phát triển đã sử dụng tin nhắn SMS để đẩy dữ liệu từ server đến ứng dụng của họ. Ngày nay, cách này phần lớn không còn được dùng nữa.

Nếu bạn là một trong những nhà phát triển, những người vẫn chưa thực hiện chuyển đổi từ tin nhắn SMS đến GCM, bạn phải biết rằng các giao thức SMS không phải là mã hóa cũng không an toàn chống lại các cuộc tấn công giả mạo. Hơn nữa, một tin nhắn SMS có thể được đọc bởi bất kỳ ứng dụng trên thiết bị của người sử dụng có sự cho phép READ_SMS.

GCM là rất nhiều an toàn hơn và là cách ưa thích để đẩy thông điệp đến một ứng dụng vì tất cả các thông tin liên lạc GCM được mã hóa. Chúng được chứng thực bằng thẻ đăng ký thường xuyên làm mới trên các mặt hàng và một khóa API duy nhất ở phía máy chủ.

6. Tránh Yêu cầu dữ liệu cá nhân

Dữ liệu riêng tư người dùng được đưa ra rất nhiều tầm quan trọng những ngày này. Trong thực tế, có những luật, chẳng hạn như bảo vệ dữ liệu của Liên minh châu Âu và Luật Bảo vệ thông tin cá nhân và tài liệu điện tử của Canada, trong đó nhiệm vụ bảo vệ sự riêng tư của người dùng. Vì vậy, trừ khi bạn có một lý do tốt và một cơ sở hạ tầng rất an toàn để thu thập, lưu trữ và truyền tải thông tin cá nhân của người sử dụng, bạn phải tránh trực tiếp yêu cầu nó trong các ứng dụng của bạn.

Một cách tiếp cận tốt hơn để xác thực người dùng và thông tin hồ sơ người sử dụng tìm kiếm trên Android là thông qua việc nhận dạng nền tảng Google. Google nhận dạng Platform cho phép người dùng nhanh chóng đăng nhập vào ứng dụng của bạn sử dụng tài khoản Google của họ. Sau một dấu hiệu thành công trong việc thông qua các nền tảng này, bất cứ khi nào cần thiết, ứng dụng của bạn có thể dễ dàng tìm kiếm thông tin chi tiết khác nhau về người sử dụng, chẳng hạn như tên người dùng, địa chỉ email, ảnh hồ sơ, danh bạ, và nhiều hơn nữa. Ngoài ra, bạn có thể sử dụng dịch vụ miễn phí như Firebase mà có thể quản lý xác thực người dùng cho bạn.

Nếu bạn phải xử lý thông tin người dùng cho mình, đó là khuyến cáo rằng bạn lưu trữ và truyền tải chúng trong các hình thức của hash an toàn. Cách đơn giản nhất để tạo ra các loại khác nhau của hash bằng cách sử dụng Android SDK là sử dụng lớp MessageDigest.

Dưới đây là một đoạn mã nhỏ đó cho bạn thấy làm thế nào để tạo ra một hash của chuỗi Hello World bằng cách sử dụng SHA256:

// Initialize MessageDigest to use SHA-256
MessageDigest md = MessageDigest.getInstance("SHA-256");

// Convert the string to a hash
byte[] sha256Hash = md.digest("Hello World".getBytes());

7. Xác nhận User Input

Trên Android, người dùng nhập vào không hợp lệ thường không dẫn đến các vấn đề an ninh như vượt đệm. Tuy nhiên, nếu bạn cho phép người dùng tương tác với một cơ sở dữ liệu SQLite hoặc một nhà cung cấp nội dung nội bộ sử dụng một cơ sở dữ liệu SQLite, bạn phải kiểm tra chặt chẽ đầu vào sử dụng hoặc sử dụng các truy vấn tham số. Không làm như vậy làm cho dữ liệu của bạn dễ bị tấn công SQL injection.

Một lưu ý tương tự, xác nhận người dùng nhập vào cũng rất quan trọng nếu bạn đang sử dụng đầu vào sử dụng để tự động tạo ra mã để chạy trên một đoạn mã script nhúng, chẳng hạn như Mozilla Rhino.

8. Sử dụng ProGuard Trước khi Publishing

Các biện pháp an ninh được xây dựng thành một ứng dụng Android có thể bị tổn hại nghiêm trọng nếu kẻ tấn công có thể chỉnh sửa trên các mã nguồn. Trước khi xuất bản ứng dụng của bạn, khuyến khích nên sử dụng một công cụ gọi là ProGuard, được bao gồm trong Android SDK, xáo trộn và giảm bớt mã nguồn.

Android Studio sẽ tự động bao gồm ProGuard trong quá trình xây dựng nếu buildType được thiết lập để phát hành. Các cấu hình ProGuard mặc định có sẵn trong tập tin Proguard-android.txt Android SDK là đủ cho hầu hết các ứng dụng. Nếu bạn muốn thêm các quy tắc tùy chỉnh các cấu hình, bạn có thể làm như vậy bên trong một tập tin có tên proguard-rules.pro, mà là một phần của tất cả các dự án Android Studio.

Kết luận

Tôi hy vọng bây giờ bạn có một sự hiểu biết tốt hơn về làm thế nào để làm cho các ứng dụng Android của bạn an toàn. Hầu hết các thực hành tốt nhất tôi đã đề cập trong bài viết này chỉ áp dụng nếu bạn đang sử dụng Android SDK để phát triển ứng dụng của bạn. Nếu bạn đang sử dụng Android NDK thay vào đó, bạn có thể có rất nhiều thận trọng hơn bởi vì, trong khi lập trình bằng ngôn ngữ C, bạn đang mong đợi để quản lý chi tiết ở mức độ thấp, chẳng hạn như các con trỏ và cấp phát bộ nhớ cho mình.

Tham khảo : http://code.tutsplus.com/articles/how-to-secure-an-android-app--cms-26385


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí