国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android通信安全之HTTPS

這篇具有很好參考價(jià)值的文章主要介紹了Android通信安全之HTTPS。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Android通信安全之HTTPS

目錄

Android通信安全之HTTPS

Https

起因

問題描述

自定義X509TrustManager

自定義HostnameVerifier

修復(fù)方案

解決方案一

解決方案2


?文章來源地址http://www.zghlxwxcb.cn/news/detail-751350.html

?

?

本文章向大家介紹Android通信安全之HTTPS,主要內(nèi)容包括Https、起因、問題描述、自定義HostnameVerifier、修復(fù)方案、解決方案2、基本概念、基礎(chǔ)應(yīng)用、原理機(jī)制和需要注意的事項(xiàng)等,并結(jié)合實(shí)例形式分析了其使用技巧,希望通過本文能幫助到大家理解應(yīng)用這部分內(nèi)容。

?

?

?

Https

HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標(biāo)的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL。 它是一個(gè)URI scheme(抽象標(biāo)識符體系),句法類同http:體系。用于安全的HTTP數(shù)據(jù)傳輸。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默認(rèn)端口及一個(gè)加密/身份驗(yàn)證層(在HTTP與TCP之間)。這個(gè)系統(tǒng)的最初研發(fā)由網(wǎng)景公司(Netscape)進(jìn)行,并內(nèi)置于其瀏覽器Netscape Navigator中,提供了身份驗(yàn)證與加密通訊方法。現(xiàn)在它被廣泛用于萬維網(wǎng)上安全敏感的通訊,例如交易支付方面。(注:本段來自百度百科)

?

?

問題描述

對于數(shù)字證書相關(guān)概念、Android 里 https 通信代碼就不再復(fù)述了,直接講問題。缺少相應(yīng)的安全校驗(yàn)很容易導(dǎo)致中間人攻擊,而漏洞的形式主要有以下3種:

自定義X509TrustManager

在使用HttpsURLConnection發(fā)起 HTTPS 請求的時(shí)候,提供了一個(gè)自定義的X509TrustManager,未實(shí)現(xiàn)安全校驗(yàn)邏輯,下面片段就是當(dāng)時(shí)新浪微博 sdk 內(nèi)部的代碼片段。如果不提供自定義X509TrustManager,代碼運(yùn)行起來可能會(huì)報(bào)異常(原因下文解釋),初學(xué)者就很容易在不明真相的情況下提供了一個(gè)自定義的X509TrustManager,卻忘記正確地實(shí)現(xiàn)相應(yīng)的方法。本文重點(diǎn)介紹這種場景的處理方式。這里引用部分相關(guān)代碼:

TrustManager tm = new X509TrustManager() {
    public void checkClientTrusted(X509Certificate[] chain, String authType)
            throws CertificateException {
              //do nothing,接受任意客戶端證書
    }

    public void checkServerTrusted(X509Certificate[] chain, String authType)
            throws CertificateException {
              //do nothing,接受任意服務(wù)端證書
    }

    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }
};

sslContext.init(null, new TrustManager[] { tm }, null);

自定義HostnameVerifier

在握手期間,如果 URL 的主機(jī)名和服務(wù)器的標(biāo)識主機(jī)名不匹配,則驗(yàn)證機(jī)制可以回調(diào)此接口的實(shí)現(xiàn)程序來確定是否應(yīng)該允許此連接。如果回調(diào)內(nèi)實(shí)現(xiàn)不恰當(dāng),默認(rèn)接受所有域名,則有安全風(fēng)險(xiǎn)。

HostnameVerifier hnv = new HostnameVerifier() {
  @Override
  public boolean verify(String hostname, SSLSession session) {
    // Always return true,接受任意域名服務(wù)器
    return true;
  }
};
HttpsURLConnection.setDefaultHostnameVerifier(hnv);

如上,如果不做任何的教研就是有風(fēng)險(xiǎn)的。

SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

修復(fù)方案

分而治之,針對不同的漏洞點(diǎn)分別描述,這里就講的修復(fù)方案主要是針對非瀏覽器App,非瀏覽器 App 的服務(wù)端通信對象比較固定,一般都是自家服務(wù)器,可以做很多特定場景的定制化校驗(yàn)。如果是瀏覽器 App,校驗(yàn)策略就有更通用一些。前面說到,當(dāng)發(fā)起 HTTPS 請求時(shí),可能拋起一個(gè)異常,以上面說到的代碼來看:

try {
    URL url = new URL("https://certs.cac.washington.edu/CAtest/");
    URLConnection urlConnection = url.openConnection();
    InputStream in = urlConnection.getInputStream();
    copyInputStreamToOutputStream(in, System.out);
} catch (MalformedURLException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
private void copyInputStreamToOutputStream(InputStream in, PrintStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int c = 0;
    while ((c = in.read(buffer)) != -1) {
        out.write(buffer, 0, c);
    }
}

它會(huì)拋出一個(gè)SSLHandshakeException的異常。這里截取部分異常。

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
   ....//省略n多錯(cuò)誤
    at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:318)
 ... 10 more
Caused by: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
 ... 16 more

解決方案一

不論是權(quán)威機(jī)構(gòu)頒發(fā)的證書還是自簽名的,打包一份到 app 內(nèi)部,比如存放在 asset 里。通過這份內(nèi)置的證書初始化一個(gè)KeyStore,然后用這個(gè)KeyStore去引導(dǎo)生成的TrustManager來提供驗(yàn)證,具體代碼如下:

try {
  CertificateFactory cf = CertificateFactory.getInstance("X.509");
  // uwca.crt 打包在 asset 中,該證書可以從https://itconnect.uw.edu/security/securing-computer/install/safari-os-x/下載
  InputStream caInput = new BufferedInputStream(getAssets().open("uwca.crt"));
  Certificate ca;
  try {
      ca = cf.generateCertificate(caInput);
      Log.i("Longer", "ca=" + ((X509Certificate) ca).getSubjectDN());
      Log.i("Longer", "key=" + ((X509Certificate) ca).getPublicKey();
  } finally {
      caInput.close();
  }

  // Create a KeyStore containing our trusted CAs
  String keyStoreType = KeyStore.getDefaultType();
  KeyStore keyStore = KeyStore.getInstance(keyStoreType);
  keyStore.load(null, null);
  keyStore.setCertificateEntry("ca", ca);

  // Create a TrustManager that trusts the CAs in our KeyStore
  String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
  TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
  tmf.init(keyStore);

  // Create an SSLContext that uses our TrustManager
  SSLContext context = SSLContext.getInstance("TLSv1","AndroidOpenSSL");
  context.init(null, tmf.getTrustManagers(), null);

  URL url = new URL("https://certs.cac.washington.edu/CAtest/");
  HttpsURLConnection urlConnection =
          (HttpsURLConnection)url.openConnection();
  urlConnection.setSSLSocketFactory(context.getSocketFactory());
  InputStream in = urlConnection.getInputStream();
  copyInputStreamToOutputStream(in, System.out);
} catch (CertificateException e) {
  e.printStackTrace();
} catch (IOException e) {
  e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
  e.printStackTrace();
} catch (KeyStoreException e) {
  e.printStackTrace();
} catch (KeyManagementException e) {
  e.printStackTrace();
} catch (NoSuchProviderException e) {
  e.printStackTrace();
}

這樣訪問非“UW Services CA Test Page”就會(huì)報(bào)SSLHandshakeException。也就是說對于特定證書生成的TrustManager,只能驗(yàn)證與特定服務(wù)器建立安全鏈接,這樣就提高了安全性。

解決方案2

同方案1,打包一份到證書到 app 內(nèi)部,但不通過KeyStore去引導(dǎo)生成的TrustManager,而是干脆直接自定義一個(gè)TrustManager,自己實(shí)現(xiàn)校驗(yàn)邏輯; 校驗(yàn)邏輯主要包括: ?服務(wù)器證書是否過期 ?證書簽名是否合法

try {
  CertificateFactory cf = CertificateFactory.getInstance("X.509");
  // uwca.crt 打包在 asset 中,該證書可以從https://itconnect.uw.edu/security/securing-computer/install/safari-os-x/下載
  InputStream caInput = new BufferedInputStream(getAssets().open("uwca.crt"));
  final Certificate ca;
  try {
      ca = cf.generateCertificate(caInput);
      Log.i("Longer", "ca=" + ((X509Certificate) ca).getSubjectDN());
      Log.i("Longer", "key=" + ((X509Certificate) ca).getPublicKey());
  } finally {
      caInput.close();
  }
  // Create an SSLContext that uses our TrustManager
  SSLContext context = SSLContext.getInstance("TLSv1","AndroidOpenSSL");
  context.init(null, new TrustManager[]{
          new X509TrustManager() {
              @Override
              public void checkClientTrusted(X509Certificate[] chain,
                      String authType)
                      throws CertificateException {

              }

              @Override
              public void checkServerTrusted(X509Certificate[] chain,
                      String authType)
                      throws CertificateException {
                  for (X509Certificate cert : chain) {

                      // Make sure that it hasn't expired.
                      cert.checkValidity();

                      // Verify the certificate's public key chain.
                      try {
                          cert.verify(((X509Certificate) ca).getPublicKey());
                      } catch (NoSuchAlgorithmException e) {
                          e.printStackTrace();
                      } catch (InvalidKeyException e) {
                          e.printStackTrace();
                      } catch (NoSuchProviderException e) {
                          e.printStackTrace();
                      } catch (SignatureException e) {
                          e.printStackTrace();
                      }
                  }
              }

              @Override
              public X509Certificate[] getAcceptedIssuers() {
                  return new X509Certificate[0];
              }
          }
  }, null);

  URL url = new URL("https://certs.cac.washington.edu/CAtest/");
  HttpsURLConnection urlConnection =
          (HttpsURLConnection)url.openConnection();
  urlConnection.setSSLSocketFactory(context.getSocketFactory());
  InputStream in = urlConnection.getInputStream();
  copyInputStreamToOutputStream(in, System.out);
} catch (CertificateException e) {
  e.printStackTrace();
} catch (IOException e) {
  e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
  e.printStackTrace();
} catch (KeyManagementException e) {
  e.printStackTrace();
} catch (NoSuchProviderException e) {
  e.printStackTrace();
}

同樣上述代碼只能訪問 certs.cac.washington.edu 相關(guān)域名地址,如果訪問 其他網(wǎng)址 ,則會(huì)在cert.verify(((X509Certificate) ca).getPublicKey());處拋異常,導(dǎo)致連接失敗。

自定義HostnameVerifier,建立匹配規(guī)則;業(yè)務(wù)復(fù)雜的話,還可以結(jié)合配置中心、白名單、黑名單、正則匹配等多級別動(dòng)態(tài)校驗(yàn);總體來說邏輯還是比較簡單的,反正只要正確地實(shí)現(xiàn)那個(gè)方法。

HostnameVerifier hnv = new HostnameVerifier() {
  @Override
  public boolean verify(String hostname, SSLSession session) {
    //示例
    if("yourhostname".equals(hostname)){  
      return true;  
    } else {  
      HostnameVerifier hv =
            HttpsURLConnection.getDefaultHostnameVerifier();
      return hv.verify(hostname, session);
    }
  }
};

主機(jī)名驗(yàn)證策略改成嚴(yán)格模式:

SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);

這樣就有效的避免了Hook。

?

到了這里,關(guān)于Android通信安全之HTTPS的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【探索 HTTPS】保障網(wǎng)絡(luò)通信的安全性

    【探索 HTTPS】保障網(wǎng)絡(luò)通信的安全性

    引言 HTTPS(HyperText Transfer Protocol Secure)是一種安全的通信協(xié)議,用于在網(wǎng)絡(luò)上安全地傳輸數(shù)據(jù)。它是基于 HTTP 協(xié)議的擴(kuò)展,通過加密通信實(shí)現(xiàn)了數(shù)據(jù)的保護(hù)和安全性。 功能介紹 加密數(shù)據(jù)傳輸: 使用加密技術(shù)對數(shù)據(jù)進(jìn)行加密,保護(hù)傳輸過程中的隱私信息。 身份驗(yàn)證: 通過數(shù)

    2024年01月23日
    瀏覽(26)
  • linux【網(wǎng)絡(luò)編程】之HTTPS協(xié)議,一文了解HTTPS是如何保證通信安全的

    linux【網(wǎng)絡(luò)編程】之HTTPS協(xié)議,一文了解HTTPS是如何保證通信安全的

    在上篇文章中我們了解到什么事HTTP協(xié)議,HTTP協(xié)議內(nèi)容都是按照?本的?式明?傳輸?shù)?這就導(dǎo)致在傳輸過程中出現(xiàn)?些被篡改的情況,本期我們來探討一下HTTPS協(xié)議。 HTTPS( 超文本傳輸安全協(xié)議 )也是?個(gè)應(yīng)?層協(xié)議.是在HTTP協(xié)議的基礎(chǔ)上引?了?個(gè)加密層. HTTPS:默認(rèn)端口與

    2024年02月08日
    瀏覽(40)
  • 前端知識(七)———HTTPS:保護(hù)網(wǎng)絡(luò)通信安全的關(guān)鍵

    當(dāng)談到網(wǎng)絡(luò)通信和數(shù)據(jù)傳輸時(shí),安全性是一個(gè)至關(guān)重要的問題。在互聯(lián)網(wǎng)上,有許多敏感信息需要通過網(wǎng)絡(luò)進(jìn)行傳輸,例如個(gè)人身份信息、銀行賬戶信息和商業(yè)機(jī)密等。為了保護(hù)這些信息不被未經(jīng)授權(quán)的人訪問和篡改,HTTPS(超文本傳輸安全協(xié)議)應(yīng)運(yùn)而生。 HTTPS是HTTP協(xié)議的

    2024年02月04日
    瀏覽(35)
  • 前端知識筆記(三十八)———HTTPS:保護(hù)網(wǎng)絡(luò)通信安全的關(guān)鍵

    當(dāng)談到網(wǎng)絡(luò)通信和數(shù)據(jù)傳輸時(shí),安全性是一個(gè)至關(guān)重要的問題。在互聯(lián)網(wǎng)上,有許多敏感信息需要通過網(wǎng)絡(luò)進(jìn)行傳輸,例如個(gè)人身份信息、銀行賬戶信息和商業(yè)機(jī)密等。為了保護(hù)這些信息不被未經(jīng)授權(quán)的人訪問和篡改,HTTPS(超文本傳輸安全協(xié)議)應(yīng)運(yùn)而生。 HTTPS是HTTP協(xié)議的

    2024年02月03日
    瀏覽(36)
  • 【Android安全】安裝mitmproxy Https抓包證書 | 安卓SSL抓包

    【Android安全】安裝mitmproxy Https抓包證書 | 安卓SSL抓包

    macbook上 mitmproxy 抓取安卓手機(jī)https流量 重點(diǎn)是安裝mitmproxy Https抓包證書 手機(jī)需要root,macbook上需要安裝好mitmproxy 需要完成下文1-3: https://github.com/doug-leith/cydia (接入有線網(wǎng)并開啟無線熱點(diǎn)) 啟用 IP 轉(zhuǎn)發(fā): sudo sysctl -w net.inet.ip.forwarding=1 保存文件: https://github.com/doug-leith/cy

    2024年01月22日
    瀏覽(17)
  • 關(guān)于網(wǎng)絡(luò)通信安全協(xié)議的一些知識(ssl,tls,CA,https)

    首先了解一下http協(xié)議的變遷。 http1.0默認(rèn)短連接,1.1默認(rèn)長連接并且可以管道傳輸,但是存在隊(duì)頭阻塞問題; https就是在tcp和http之間加了SSL/TLS層。 http2也是安全的,改進(jìn)是hpack二進(jìn)制和編碼壓縮減小體積,stream沒有隊(duì)頭阻塞了(TCP層還有),以及服務(wù)器主動(dòng)推送功能; http

    2024年02月15日
    瀏覽(34)
  • 常見網(wǎng)絡(luò)通信協(xié)議(http、https、ws)及安全協(xié)議(SSL、TLS、XTLS)

    常見網(wǎng)絡(luò)通信協(xié)議(http、https、ws)及安全協(xié)議(SSL、TLS、XTLS)

    文章內(nèi)容刪除了一大半不合適的內(nèi)容,發(fā)不出來,你懂得。?? HTTP和HTTPS都屬于 應(yīng)用層協(xié)議 ,它們都是用于從萬維網(wǎng)(WWW)服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議。它們都是 基于 TCP/IP 協(xié)議 來傳遞數(shù)據(jù)的,支持 客戶端-服務(wù)器模式 的通信。 HTTP和HTTPS的區(qū)別主要在于HTT

    2024年02月10日
    瀏覽(39)
  • HTTPS 為什么是安全的 _ (下),掌握了這些Android高級工程師必備知識

    HTTPS 為什么是安全的 _ (下),掌握了這些Android高級工程師必備知識

    證書 的目的是確保公鑰的合法性,它的本質(zhì)就是為公鑰加上數(shù)字簽名。它的安全性由證書鏈頂端的根證書來保證。 如果你對這幾個(gè)工具還不是很熟悉,就無法徹底的了解 HTTPS 的通信流程,不妨再閱讀一遍 HTTPS 為什么是安全的 ? (上) 。 有了這些前置知識,下面就來深入剖析

    2024年04月11日
    瀏覽(37)
  • HTTPS安全通信

    HTTPS安全通信

    Hyper Text Transfer Protocol over Secure Socket Layer,安全的超文本傳輸協(xié)議,網(wǎng)景公式設(shè)計(jì)了SSL(Secure Sockets Layer)協(xié)議用于對Http協(xié)議傳輸?shù)臄?shù)據(jù)進(jìn)行加密,保證會(huì)話過程中的安全性。 使用TCP端口默認(rèn)為443 TLS:(Transport Layer Security,傳輸層安全協(xié)議),用于兩個(gè)應(yīng)用程序之間提供保密性和

    2024年02月13日
    瀏覽(13)
  • HTTPS解密:安全通信的魔法之窗

    HTTPS解密:安全通信的魔法之窗

    歡迎來到我的博客,代碼的世界里,每一行都是一個(gè)故事 在網(wǎng)絡(luò)通信中,信息的安全性是至關(guān)重要的。而HTTPS作為保障通信安全的重要協(xié)議,就像一把鎖,為我們的數(shù)據(jù)通信提供了強(qiáng)大的保護(hù)。在這篇博客中,我們將揭開HTTPS的神秘面紗,了解它是如何通過加密技術(shù)保障通信

    2024年02月04日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包