Android 網(wǎng)絡(luò)安全之https

簡單說一下 http 和https 的區(qū)別 http是應(yīng)用層協(xié)議 而https是http 的升級版 是網(wǎng)絡(luò)安全大趨勢之下的產(chǎn)物 在現(xiàn)有條件下 常規(guī)的http已經(jīng)無法保證數(shù)據(jù)和平臺的安全,所以https 已成大勢 目前的http 通過一些工具是可以抓取到數(shù)據(jù)的 例如Fiddler 毁涉,charles 就能輕易抓取http的請求數(shù)據(jù) 而https 則可以輕松避免這種抓取數(shù)據(jù)的方式
http 請求是通過 http + tcp 進行的應(yīng)用傳輸?shù)? 而https 則是在http 和 tcp 之間加了一層安全驗證也就是 SSL/TLS的驗證 數(shù)據(jù)證書驗證是使用CA證書(數(shù)據(jù)證書頒發(fā)機構(gòu)辦法的證書)進行密碼校驗 通過驗證才能進行網(wǎng)絡(luò)請求

下面說一下android 的https (以okhttp為例)

先說下本人的策略 使用二級緩存的方法進行證書加載 現(xiàn)在很多朋友大都是以硬編碼的方式或內(nèi)置證書的方式加載 本人覺得這種方式是不安全的 第一不安全是因為有意破壞者可以通過反編譯 或者 破解獲取你的證書 第二 ca證書是由時間限制的 如果時間到期 再去更換證書 而你只能通過強制更新才能讓用戶進行使用 這個會給用戶很不好的體驗

我的策略是 內(nèi)置加緩存的方式加載證書 首先緩存是需要權(quán)限的 若用戶沒有授權(quán) 則終端無法緩存 用戶也就無法正常使用 此時我使用內(nèi)置的 如果客戶授權(quán)了讀寫權(quán)限 我就是用緩存的 以此避免證書過期問題

證書驗證 也有兩種方式 第一 單項驗證(弱驗證)(服務(wù)器驗證客戶端攜帶的證書是否有效)第二 雙向驗證(強驗證) 客戶端驗證
服務(wù)端握手時返回的公鑰信息進行host驗證 服務(wù)器在驗證客戶端的數(shù)字簽名是否正確 一般雙向驗證是 瀏覽器金融類app等使用的較多 也是非常安全的一種方式 坪哄; 我使用的是第一種單項驗證 因為我的host是我自己設(shè)定好的 所以我沒有進行host 驗證

public class SSLUtil {

    /**
     * 獲取SSLSocketFactory
     *
     * @param certificates 證書流文件
     * @return
     */
    public static SSLSocketFactory getSSLSocketFactory(InputStream... certificates) {

        try {
            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(null);
            int index = 0;
            for (InputStream certificate : certificates) {
                String certificateAlias = Integer.toString(index++);
                keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));
                try {
                    if (certificate != null)
                        certificate.close();
                } catch (IOException e) {
                }
            }
            SSLContext sslContext = SSLContext.getInstance("TLS");
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init(keyStore);
            sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
            return sslContext.getSocketFactory();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

返回SSLSocketFactory 

// 網(wǎng)絡(luò)請求方法
OkHttpClient.Builder okBuilder = new OkHttpClient.Builder().addInterceptor(interceptor)
               .writeTimeout(BaseConstant.NET_WRITE_TIME_OUT, TimeUnit.SECONDS)
               .readTimeout(BaseConstant.NET_READ_TIME_OUT, TimeUnit.SECONDS)
               .connectTimeout(BaseConstant.NET_REQUEST_TIME_OUT, TimeUnit.SECONDS)
               .retryOnConnectionFailure(true)
               .addInterceptor(new ErrorStatuInterceptor())
               .addInterceptor(new PrintLogInterceptor());
       if (CA.getCAFile()!=null){
           if (SSLUtil.getSSLSocketFactory(CA.getCAByte()) != null){
               okBuilder.hostnameVerifier(new HostnameVerifier() {
                   @Override
                   public boolean verify(String s, SSLSession sslSession) {
                       return true;
                   }
                 }).sslSocketFactory(SSLUtil.getSSLSocketFactory(CA.getCAByte()));
           }
       }else {
           if (SSLUtil.getSSLSocketFactory(CA.getCAByte()) != null){
               try {
                   okBuilder.hostnameVerifier(new HostnameVerifier() {
                       @Override
                       public boolean verify(String s, SSLSession sslSession) {
                           return true;
                       }
                   }).sslSocketFactory(SSLUtil.getSSLSocketFactory(UiUtils.getContext().getAssets().open("nade.cer")));
               } catch (IOException e) {
                   e.printStackTrace();
               }
               //  }).sslSocketFactory(SSLUtil.getSSLSocketFactory(CA.getCAByte()));
           }

       }

// 此方法用于驗證host 返回true 是不驗證

 okBuilder.hostnameVerifier(new HostnameVerifier() {
                   @Override
                   public boolean verify(String s, SSLSession sslSession) {
                       return true;
                   }

這個可以可以根據(jù)需要進行驗證

好了 不多說 到此結(jié)束 有需要可以私信我

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末傅瞻,一起剝皮案震驚了整個濱河市褂萧,隨后出現(xiàn)的幾起案子轴合,更是在濱河造成了極大的恐慌伊脓,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件断凶,死亡現(xiàn)場離奇詭異伤提,居然都是意外死亡,警方通過查閱死者的電腦和手機懒浮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門飘弧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人砚著,你說我怎么就攤上這事次伶。” “怎么了稽穆?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵冠王,是天一觀的道長。 經(jīng)常有香客問我舌镶,道長柱彻,這世上最難降的妖魔是什么豪娜? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮哟楷,結(jié)果婚禮上瘤载,老公的妹妹穿的比我還像新娘。我一直安慰自己卖擅,他們只是感情好鸣奔,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惩阶,像睡著了一般挎狸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上断楷,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天锨匆,我揣著相機與錄音,去河邊找鬼冬筒。 笑死恐锣,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的账千。 我是一名探鬼主播侥蒙,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼匀奏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起学搜,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤娃善,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瑞佩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體聚磺,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年炬丸,在試婚紗的時候發(fā)現(xiàn)自己被綠了瘫寝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡稠炬,死狀恐怖焕阿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情首启,我是刑警寧澤暮屡,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站毅桃,受9級特大地震影響褒纲,放射性物質(zhì)發(fā)生泄漏准夷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一莺掠、第九天 我趴在偏房一處隱蔽的房頂上張望衫嵌。 院中可真熱鬧,春花似錦彻秆、人聲如沸渐扮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽墓律。三九已至,卻和暖如春幔亥,著一層夾襖步出監(jiān)牢的瞬間耻讽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工帕棉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留针肥,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓香伴,卻偏偏與公主長得像慰枕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子即纲,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 1具帮,從素材到線稿,將素材概括重組一下低斋,提煉出哪些重點刻畫蜂厅,哪些虛化。 將遠山變虛膊畴,重點刻畫近景的人物掘猿。因為畫...
    步搖閱讀 821評論 0 2
  • 使用dispatch_once的注意事項: 此函數(shù)接收類型為dispatch_once_t的特殊參數(shù),還有一個塊參...
    皆為序幕_閱讀 289評論 0 0
  • 一直以來唇跨,我都很喜歡一句話——我噠噠的馬蹄是個美麗的錯誤稠通,我不是歸人,我只是個過客买猖。 是啊改橘,我不愿把路過我人生的人...
    今心何兮閱讀 566評論 0 2