Khắc phục lỗi Mã hóa không an toàn

Thông tin này dành cho nhà phát triển có (các) ứng dụng sử dụng phương thức mã hóa không an toàn. Đó là một đoạn mật mã mà hệ thống tạo bằng vectơ khởi đầu (IV), dữ liệu muối hoặc khóa bí mật tính toán cố định. Bạn có thể tìm thấy vị trí của mật mã không an toàn trong ứng dụng của bạn trong thông báo về ứng dụng trên Play Console

Cách khắc phục cảnh báo "Cách mã hóa không an toàn" 

Xem lại ứng dụng của bạn để tìm các khóa, vectơ khởi đầu và/hoặc dữ liệu muối tính toán cố định mà hệ thống sử dụng trong quá trình mã hóa và đảm bảo rằng các giá trị này được tính toán an toàn. Ví dụ: đoạn mã sau sử dụng khóa bí mật và vectơ khởi đầu tính toán cố định:

   // Thông báo trên Console để chỉ phương pháp sau
  public byte[] encryptionUtil(String key, String iv, byte[] plainText) {
    Cipher cipher = Cipher.getInstance(“AES/GCM/NoPadding”);
    SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), “AES”);
    GCMParameterSpec paramSpec = new GCMParameterSpec(256, iv.getBytes());
    cipher.init(Cipher.ENCRYPT_MODE, keySpec, paramSpec);
    return cipher.doFinal(plainText);
  }

  // Vector khởi đầu và khóa không an toàn là ở đây và cần thay đổi
  byte[] cipherText = encryptionUtil(“abcdef...”, “010203040506”, plainText);

Giá trị tính toán cố định
Giá trị tính toán cố định là một giá trị không đổi trong mỗi lần ứng dụng của bạn hoạt động. Các giá trị mã hóa cố định có thể được trích xuất từ ứng dụng của bạn và dùng để tấn công dữ liệu đã mã hóa trong ứng dụng. Ngay cả khi bạn đã chỉnh sửa các khóa, vectơ khởi đầu và dữ liệu muối theo những cách phức tạp trước khi sử dụng, chúng vẫn không an toàn nếu bạn chỉnh sửa theo cách giống nhau mỗi lần chạy chương trình.

Các phương pháp hay nhất về Android
Chúng tôi khuyên bạn nên sử dụng Jetpack Security cho mật mã đối xứng. Nếu ứng dụng của bạn mã hóa các khóa API, thông tin nhận dạng cá nhân (PII) hoặc dữ liệu nhạy cảm khác, thì bạn có thể sử dụng EncryptedSharedPreferences để lưu trữ dữ liệu này một cách an toàn mà không phải lo lắng về việc triển khai khóa bí mật, vectơ khởi đầu và dữ liệu muối. Bạn có thể xem các phương pháp hay khác và ví dụ trên trang này. Để truyền dữ liệu một cách an toàn đến các hệ thống khác, nhà phát triển nên sử dụng TLS/SSL để bảo mật dữ liệu khi truyền. 

Jetpack Security sử dụng Tink dự án nguồn mở của Google để xử lý việc mã hóa xác thực đối xứng. Trong các trường hợp bạn thực hiện việc mã hóa cấp thấp theo cách nâng cao hơn, hãy sử dụng Tink trực tiếp.

Nếu các phương pháp hay về Android nêu trên không phù hợp với cách sử dụng của bạn và bạn được yêu cầu quản lý các khóa, vectơ khởi đầu và dữ liệu muối một cách rõ ràng, thì chúng tôi khuyên bạn nên tuân theo các tiêu chuẩn sau:

  1. Khóa bí mật: Khóa bí mật đối xứng phải là một khóa bí mật và khó dự đoán. Để mã hóa dữ liệu cục bộ, nhà phát triển nên xây dựng các khóa bí mật bằng cách sử dụng mã ngẫu nhiên bảo mật (hoặc từ dữ liệu do người dùng tạo, nếu sử dụng PBEKeySpecs) và lưu trữ các khóa bí mật bằng AndroidKeystore
  2. Các vectơ khởi đầu: Các vectơ khởi đầu trong các thông báo phải là duy nhất và khó dự đoán, nhưng không cần phải là dữ liệu bí mật. Các nhà phát triển nên xây dựng các vectơ khởi đầu bằng cách sử dụng mã ngẫu nhiên bảo mật. Nhà phát triển cũng nên lưu trữ hoặc truyền các vectơ khởi đầu cùng với đoạn mật mã liên quan.
  3. Dữ liệu muối: Dữ liệu muối trong các hàm băm phải là duy nhất và khó dự đoán, nhưng không cần phải là dữ liệu bí mật. Các nhà phát triển nên xây dựng dữ liệu muối bằng cách sử dụng mã ngẫu nhiên bảo mật. Nhà phát triển cũng nên lưu trữ hoặc truyền dữ liệu muối cùng với các hàm băm liên quan.

Các bước tiếp theo

  1. Cập nhật ứng dụng của bạn bằng cách sử dụng các bước nêu trên.
  2. Đăng nhập vào Play Console và gửi phiên bản cập nhật của ứng dụng.
Chúng tôi sẽ xem xét lại ứng dụng của bạn. Bạn sẽ vẫn thấy thông báo nếu chưa cập nhật ứng dụng đúng cách. Quá trình này có thể mất vài giờ.

Chúng tôi sẵn sàng trợ giúp

Nếu có câu hỏi kỹ thuật về lỗ hổng bảo mật, bạn có thể đăng lên Stack Overflow và sử dụng thẻ “android-security”.
 

Thông tin này có hữu ích không?

Chúng tôi có thể cải thiện trang này bằng cách nào?
false
Trình đơn chính
14538471387824825392
true
Tìm kiếm trong Trung tâm trợ giúp
true
true
true
true
true
5016068
false
false