2017-06-19 6 views
7

के साथ एंड्रॉइड पर प्रमाणपत्र पिनिंग मैं एंड्रॉइड पर पिनिंग प्रमाणपत्र के बारे में पढ़ रहा हूं और मैं उलझन में हूं। मैं okhttp या retrofit का उपयोग नहीं कर रहा हूँ इसलिए मुझे इसे मैन्युअल रूप से करना है। यहां एक ट्यूटोरियल है: https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning#Android जहां वे विश्वसनीय प्रमाणपत्रों की सूची में प्रमाण पत्र जोड़ रहे हैं। लेकिन एक और ट्यूटोरियल भी है जब हम सर्वर पर स्थापित प्रमाणपत्र के sha256 के बेस 64 की जांच कर रहे हैं: https://medium.com/@appmattus/android-security-ssl-pinning-1db8acb6621e कौन सा दृष्टिकोण सही है? हम हेडर में सर्वर से sha256 क्यों प्राप्त नहीं कर सकते हैं क्योंकि ब्राउजर करते हैं और इसे कहीं स्टोर करते हैं?Robospice

उत्तर

0

मैं इस
https://www.paypal-engineering.com/2015/10/14/key-pinning-in-mobile-applications/

एंड्रॉयड विधि

सरल दृष्टिकोण नीचे दिखाया गया के रूप में एक JSEE आधारित पद्धति का उपयोग करने के लिए है की सिफारिश करेंगे। एंड्रॉइड के लिए यह अनुशंसित दृष्टिकोण है। विधि का इनपुट तर्क एक HTTPS कनेक्शन और लक्षित यूआरएल के लिए वैध पिन का एक सेट है।


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; 
} 

पिन तार के रूप में घोषित कर रहे हैं। उदाहरण के लिए:

कुंजी पिंस

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

घोषणा उपरोक्त विधि का इस्तेमाल, यहाँ दिखा कि यह कैसे उपयोग करने के लिए रखा जा सकता है एक उदाहरण है। एकमात्र प्रासंगिक भाग नीचे हाइलाइट किया गया है। `एक और अधिक सुरुचिपूर्ण समाधान कर दिया गया है:

उदाहरण कुंजी लगाए

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

का उपयोग https://medium.com/@appmattus/android-security-ssl-pinning-1db8acb6621e के अनुसार इस विधि अप्रभावी है मोबाइल एप्लिकेशन में कुंजी पिनिंग में पेपैल द्वारा आगे बढ़ें, हालांकि यह अप्रभावी प्रमाणपत्र पिनिंग कार्यान्वयन की परीक्षा में चर्चा की गई सुरक्षा दोष से पीड़ित है। प्रस्तावित कोड httpsUrlConnection.getServerCertificates() के खिलाफ पिन को चेक करता है जो सर्वर से प्रमाणपत्र सुझावों की एक सूची देता है और डिवाइस द्वारा आवश्यक रूप से विश्वसनीय नहीं है। – falsetto