Một vài phương pháp để nâng cao tính bảo mật của ứng dụng Android

Một file APK (Android Package Kit) là một tập tin được sử dụng để cài đặt lên các thiết bị Android. Mỗi một tập tin apk được xem như là một ứng dụng dùng để chạy trên hệ điều hành Android. Khi có một tập tin apk chúng ta có thể dễ dàng cài đặt hoặc cập nhật ứng dụng ở trên thiết bị. Điều này cũng dẫn tới một vài rủi do về bảo mật có thể xảy đến. Dưới đây sẽ là một vài cách để giúp chúng ta bảo vệ được file apk cũng như ứng dụng của mình.

1. Tạo keystore

Việc tạo keystore sẽ giúp chắc chắn rằng file app sẽ không bị giả mạo. Để tạo keystore ta có thể dùng keytool của JDK (Java Development Kit).

Ví dụ để tạo ra một keystore ta sẽ sử dụng câu lệnh sau:

keytool -genkey -v -keystore sample-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

2. Làm rối code

Đơn giản thì đây là việc thông qua một loạt các biến đổi, chẳng hạn như đổi tên biến/hàm/đối số, loại bỏ chuỗi và các biến đổi khác, mã nguồn của ta được chuyển thành một thứ gì đó khó đọc hiểu, trong khi vẫn hoạt động chính xác như trước. Điều này sẽ làm việc dịch ngược mã nguồn để khai thác các lỗ hổng trở nên khó khăn. Có một vài công cụ có thể giúp obfuscate như là Proguard cho Android và DashO cho Java.

Để sử dụng proguard trong một project Android ta làm như sau:

  • Đầu tiên trong tập tin build.gradle của module app ta thêm khai báo:
android {
    ...
    buildTypes {
        release {
            minifyEnabled true
	    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            ...
        }
        debug {
            minifyEnabled false
            ...
        }
    }
    ...
}
  • Tiếp đó ta thêm các config cần thiết trong file proguard-rules.pro của module app. Các config có thể là giữ lại một class hoặc một package không bị làm rối code,…
-dontwarn com.example.**
-keep class com.example.** { *; }

3. Mã hoá

Việc mã hoá các dữ liệu nhạy cảm là một điều vô cùng cần thiết để bảo vệ ứng dụng khỏi các bên thứ ba. Android cũng cung cấp một vài APIs để chúng ta có thể thực hiện việc mã hoá dữ liệu như là Android Keystore System và Cipher.

Ví dụ:

// Tạo key
KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder(ALIAS, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
        .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
        .build();
keyGenerator.init(keyGenParameterSpec);
SecretKey secretKey = keyGenerator.generateKey();
// Mã hoá dữ liệu
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedData = cipher.doFinal(data);
// Giải mã dữ liệu
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedData = cipher.doFinal(encryptedData);

Ngoài cách sử dụng Android Keystore System và Cipher chúng ta cũng có thể sử dụng các thư viện mã hoá khác như JCE (Java Cryptography Extension), SecureRandom

4. Cấp quyền cho ứng dụng một cách đúng đắn

Android sử dụng một hệ thống quản lý quyền cho các ứng dụng, nhằm mục đích bảo về quyền riêng tư và tăng tính bảo mật dữ liệu của người dùng. Để ứng dụng có thể đẩy được lên Google Play Store, chúng ta phải chỉ ra cụ thể các quyền mà ứng dụng của ta cần. Điều này sẽ đảm bảo việc người dùng sẽ biết được các quyền mà ứng dụng sẽ dùng, cùng với đó ta sẽ chỉ thực sự dùng các quyền mà nó là cần thiết cho các tính năng của ứng dụng. 

Ví dụ:

if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(getActivity(),
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 100);
            return;
        }

5. Sử dụng Network Security Configuration

Từ Android 7.0 (API 24) trở lên ta có thể cấu hình network security cho ứng dụng Android như là cấu hình TLS/SSL, Certificate pinning và các phương pháp bảo mật khác. 

Ta có thể tạo network security configuration trong ứng dụng Android như sau:

Đầu tiên ta sẽ tạo tập tin network_security_config.xml trong thư mục res/xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="system" />
            <certificates src="user" />
        </trust-anchors>
    </base-config>
</network-security-config>

Trong AndroidManifest.xml ta thêm khai báo:

<application android:networkSecurityConfig="@xml/network_security_config" ...>

6. Sử dụng các thư viện và công cụ security

Ta có thể sử dụng một vài thư viện và công cụ để tăng tính bảo mật của ứng dụng Android như là: OWASP (Mobile Security Testing Guide), Android Developer Tools Suite, Android Security Test Suite,…

Leave a Reply

Your email address will not be published. Required fields are marked *