2017-06-19 26 views
7

Tôi đang đọc về ghim chứng chỉ trên Android và tôi bị nhầm lẫn. Tôi không sử dụng okhttp hoặc trang bị thêm vì vậy tôi phải làm điều đó theo cách thủ công. Có một hướng dẫn tại đây: https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning#Android nơi họ thêm chứng chỉ vào danh sách chứng chỉ đáng tin cậy. Nhưng cũng có một hướng dẫn khác khi chúng tôi kiểm tra base64 của sha256 của chứng chỉ được cài đặt trên máy chủ: https://medium.com/@appmattus/android-security-ssl-pinning-1db8acb6621e Cách tiếp cận nào là đúng? Tại sao chúng ta không thể nhận sha256 từ máy chủ trong tiêu đề khi trình duyệt thực hiện và lưu trữ ở đâu đó?Chứng chỉ ghim trên Android với Robospice

Trả lời

0

Tôi muốn giới thiệu này
https://www.paypal-engineering.com/2015/10/14/key-pinning-in-mobile-applications/

Android Phương pháp

Phương pháp đơn giản nhất là sử dụng một phương pháp JSEE dựa trên như hình dưới đây. Đây là phương pháp được đề xuất cho Android. Đối số đầu vào của phương thức là kết nối HTTPS và một tập hợp các chân hợp lệ cho URL được nhắm mục tiêu.


private boolean validatePinning(HttpsURLConnection conn, Set<String> validPins) { 
    try { 
     Certificate[] certs = conn.getServerCertificates(); 
     MessageDigest md = MessageDigest.getInstance("SHA-256"); 
     for (Certificate cert : certs) { 
      X509Certificate x509Certificate = (X509Certificate) cert; 
      byte[] key = x509Certificate.getPublicKey().getEncoded(); 
      md.update(key, 0, key.length); 
      byte[] hashBytes = md.digest(); 
      StringBuffer hexHash = new StringBuffer(); 
      for (int i = 0; i < hashBytes.length; i++) { 
       int k = 0xFF & hashBytes[i]; 
       String tmp = (k<16)? "0" : ""; 
       tmp += Integer.toHexString(0xFF & hashBytes[i]); 
       hexHash.append(tmp); 
      } 
      if (validPins.contains(hexHash.toString())) { 
       return true; 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return false; 
    } 
    return false; 
} 

Các chân được khai báo là chuỗi. Ví dụ:

Tuyên bố chính Pins

private static final Set<String> PINS = new HashSet<String>(Arrays.asList(
     new String[]{ 
       "996b510ce2380da9c738...87cb13c9ec409941", 
       "ba47e83b1ccf0939bb40d2...edf856ba892c06481a"})); 

Tận dụng các phương pháp trên, đây là một ví dụ cho thấy cách này có thể được đưa vào sử dụng. Phần có liên quan duy nhất được đánh dấu bên dưới.

Ví dụ Sử dụng chính Ghim cho

protected String doInBackground(String... urls) { 
    try { 
     /** Test pinning given the target URL **/ 
     /** for now use pre-defined endpoint URL instead or urls[0] **/ 
     Log.i(LOG_TAG, "==> PinningTestTask launched."); 
     String dest = defaultEndpoint; 
     URL targetURL = new URL(dest); 
     HttpsURLConnection targetConnection = (HttpsURLConnection) targetURL.openConnection(); 
     targetConnection.connect(); 
     if (validatePinning(targetConnection, PINS)) { 
      final String updateText = "Key pinning succeded for: " + dest; 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        textView.setText(updateText); 
       } 
      }); 
     } else { 
      final String updateText = "Key pinning failed for: " + dest; 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        textView.setText(updateText); 
       } 
      }); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     final String updateText = "Key pinning failed for: " + dest + "\n" + e.toString(); 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       textView.setText(updateText); 
      } 
     }); 
    } 
    return null; 
} 
+0

Theo https://medium.com/@appmattus/android-security-ssl-pinning-1db8acb6621e phương pháp này là không hiệu quả: 'Một giải pháp thanh lịch hơn là đặt chuyển tiếp bằng PayPal trong Key Pinning trong các ứng dụng di động tuy nhiên điều này bị lỗ hổng bảo mật được thảo luận trong một kỳ thi của chứng chỉ không hiệu quả Pinning triển khai. Mã được đề xuất kiểm tra các chân chống lại httpsUrlConnection.getServerCertificates() trả về danh sách các đề xuất chứng chỉ từ máy chủ và không nhất thiết phải được thiết bị tin cậy ”. – falsetto

Các vấn đề liên quan