Mặc dù hiện nay nhiều ứng dụng tin tức không yêu cầu tính bảo mật cao, nhưng vẫn cần đảm bảo an toàn cho sản phẩm. Việc áp dụng các phương pháp bảo mật đơn giản sẽ giúp bảo vệ ứng dụng. Hãy cùng xem bài viết dưới đây để biết cách bảo mật ứng dụng Android trước khi phát hành đến người dùng.
Rút gọn, tối ưu và làm phức tạp hoá mã code với Proguard.
Hiện nay, khi sử dụng công cụ Proguard có sẵn trong Android Studio, bạn có thể thu nhỏ kích thước ứng dụng bằng cách loại bỏ các thư viện, mã code và tài nguyên không cần thiết. Điều này không chỉ giúp giảm dung lượng app mà còn làm cho mã code trở nên phức tạp hơn, từ đó giúp bảo mật ứng dụng và ngăn chặn việc dịch ngược mã code. Mặc dù việc sử dụng Proguard không bắt buộc trong quá trình phát triển ứng dụng Android, nhưng đây là một bước quan trọng không thể thiếu trước khi đưa ứng dụng lên App Store. Dưới đây là hai bước cơ bản để sử dụng tính năng Proguard:
Bước 1: Bật tùy chọn sử dụng tính năng proguard nằm trong file build.gradle như sau:
123456789 | buildTypes { debug{…} release { minifyEnabled true //Loại bỏ những tài nguyên không cần thiết shrinkResources true //Thu gọn size code,loại bỏ code thừa useProguard true //Làm phức tạp hoá code proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’ }} |
Bước 2: Cấu hình Proguard được thực hiện mặc định thông qua file cấu hình “proguard-rules.pro”.Bạn có thể lên mạng tra video hướng dẫn để cấu hình trên trang Proguard hoặc các ví dụ chi tiết sample trên trang web github. Ví dụ nếu bạn muốn xoá toàn bộ các tin nhắn log trong quá trình phát triển trong phiên bản release thì sẽ config như dưới đây trong file “proguard-rules.pro”
1234567 | -assumenosideeffects class android.util.Log { public static boolean isLoggable(java.lang.String, int); public static int d(…); public static int w(…); public static int v(…); public static int i(…);} |
Khi bạn làm như này thì tất cả các dòng sinh tin nhắn log trong code của bạn sẽ được xóa khi build phiên bản release. Thật tuyệt vời đúng không nào? Sau khi sử dụng proguard bạn sẽ nhận thấy rằng size của app được giảm đáng kể, làm rút ngắn quá trình tải app của người dùng, cũng như tiết kiệm dung lượng memory của những máy Android có cấu hình đời cũ.
Lưu ý rằng là do app của chúng ta đã được làm mờ(phức tạp hoá) lên trong quá trình sử dụng mà muốn theo dõi phân tích các log crash, log cảnh báo trên các công cụ phân tích của Google Play Store, hay Firebase chẳng hạn, thì chúng ta cần sử dụng đến các file mapping được sinh ra khi build app để có thể dịch ngược lại các message log.
An toàn và đảm bảo hơn khi sử dụng khoá ứng dụng của Google play(Google Play key store).
Khi xây dựng ứng dụng, bạn cần sử dụng khóa ứng dụng keystore. Hiện nay, bạn có thể dễ dàng tạo keystore bằng công cụ Android Studio. Tuy nhiên, việc lưu trữ keystore không cẩn thận có thể rất nguy hiểm, như bị mất hoặc bị đánh cắp. Do đó, sử dụng Google Play Keystore là một giải pháp rất hiệu quả để quản lý khóa ứng dụng. Khoá này sẽ được lưu trữ và quản lý trên App Store, giúp tránh rủi ro bị lộ hoặc mất do sự cố như hỏng ổ cứng hoặc vô tình xóa mất.
Nếu là lần đầu tiên đăng ký ứng dụng lên Store, bạn có thể sử dụng dịch vụ quản lý chữ ký ứng dụng của Google Play một cách dễ dàng. Trong phần cài đặt khi đưa app lên Release, chỉ cần chọn tùy chọn “有効” (kích hoạt) chương trình chữ ký ứng dụng. Sau đó, bạn chỉ cần upload file APK đã được build với khóa ứng dụng của bạn lên như bình thường. Chương trình quản lý chữ ký của Google sẽ tạo cho bạn một key mới, thay thế cho khóa ứng dụng của bạn, và bạn sẽ thấy thông tin chữ ký mới trong mục “アプリの署名” (Chữ ký ứng dụng) của Google Play Console.
Lưu ý rằng, vì app của bạn đã sử dụng chữ ký mới của Google, nếu ứng dụng cần sử dụng dịch vụ của bên thứ ba như Firebase, và yêu cầu mã chứng thực ứng dụng (ví dụ: SHA-1), bạn cần thêm hoặc thay thế mã SHA-1 bằng mã SHA-1 của keystore mới của Google Play. Thông tin này có thể được tìm thấy trong mục “アプリの署名” của Google Play Console.
Mã hoá các thông tin quan trọng như mật khẩu, access key với Android keystore system.
Trong quá trình phát triển ứng dụng, việc sử dụng các thuật toán mã hóa như Cipher, MessageDigest, Mac, và Signature để bảo vệ các thông tin quan trọng là một bước cần thiết và rất dễ thực hiện. Bạn không nên để các giá trị nhạy cảm như mật khẩu, khóa API, hay thông tin cá nhân trong mã nguồn (hardcode) mà không bảo vệ chúng. Việc sử dụng mã hóa dữ liệu giúp bảo vệ an toàn hơn và làm cho ứng dụng của bạn trở nên chuyên nghiệp hơn.
Dưới đây là một ví dụ về cách sử dụng Cipher
để mã hóa và giải mã dữ liệu trong Android:
Bước 1: Đầu tiên cần Get thông tin Keystore app của bạn
1234567 | private KeyStore mKeyStoretry { mKeyStore = KeyStore.getInstance(“AndroidKeyStore”); mKeyStore.load(null);}catch (Exception e) { Log.e(TAG, e.toString());} |
Bước 2: Tạo một cặp khoá mới (public key/private key) để sử dụng trong ứng dụng.
12345678910111213141516 | try { if (!keyStore.containsAlias(alias)) { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance( KeyProperties.KEY_ALGORITHM_RSA,”AndroidKeyStore”); keyPairGenerator.initialize( new KeyGenParameterSpec.Builder( alias, KeyProperties.PURPOSE_DECRYPT) .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP) .build()); keyPairGenerator.generateKeyPair(); }} catch (Exception e) { Log.e(TAG, e.toString());} |
Bước 3: Mã hoá thông tin trước khi lưu trữ
123456789101112131415 | String ALGORITHM = “RSA/ECB/OAEPWithSHA-256AndMGF1Padding”;String encryptedText = null;try { PublicKey publicKey = keyStore.getCertificate(alias).getPublicKey(); Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, publicKey); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); CipherOutputStream cipherOutputStream = new CipherOutputStream(outputStream, cipher); cipherOutputStream.write(plainText.getBytes(“UTF-8”)); cipherOutputStream.close(); byte [] bytes = outputStream.toByteArray(); encryptedText = Base64.encodeToString(bytes, Base64.DEFAULT);} catch (Exception e) { Log.e(TAG, e.toString());} |
Bước 4: Giải mã và lấy thông tin
1234567891011121314151617 | String plainText = null;try { PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, null); Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, privateKey); CipherInputStream cipherInputStream = new CipherInputStream( new ByteArrayInputStream(Base64.decode(encryptedText, Base64.DEFAULT)), cipher); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); int b; while ((b = cipherInputStream.read()) != -1) { outputStream.write(b); } outputStream.close(); plainText = outputStream.toString(“UTF-8”);} catch (Exception e) { Log.e(TAG, e.toString());} |
Với ba phương pháp đơn giản trên, bạn đã có thể làm cho ứng dụng của mình trở nên an toàn và chuyên nghiệp hơn rất nhiều. Tuy nhiên, ngoài những phương pháp này, còn rất nhiều cách khác để bảo vệ ứng dụng của bạn trên nền tảng Android, một môi trường vốn dĩ được biết đến là mở và dễ bị tấn công. Việc áp dụng các biện pháp bảo mật không chỉ giúp ứng dụng của bạn an toàn hơn mà còn góp phần xây dựng niềm tin của người dùng đối với hệ điều hành Android.
Hãy tiếp tục nghiên cứu và tìm hiểu thêm các kỹ thuật bảo mật khác để có thể phát triển ứng dụng không chỉ mạnh mẽ mà còn đáng tin cậy. Các bước này sẽ giúp bạn khắc phục những lỗ hổng bảo mật và nâng cao sự an toàn cho cả người dùng lẫn dữ liệu của họ.
One thought on “Cách bảo mật App Android trước khi Public lên Google Play”