Http 與 Https

本文主要關注Https的兩個核心問題:Https如何加密,以及Https如何保證安全

Https加密過程

Https加密過程直接用下面這張圖可以加以說明:

Https加密有三個關鍵點:

  1. Https傳輸過程中用到了對稱加密和非對稱加密。對稱加密:通信雙方采用相同密鑰進行加解密;非對稱加密:傳輸數據采用公鑰加密,必須采用公鑰對應的私鑰才能解密。
    對稱加密:

    encrypt(明文,秘鑰) = 密文
    decrypt(密文,秘鑰) = 明文
    

    非對稱加密:

    encrypt(明文,公鑰) = 密文
    decrypt(密文,私鑰) = 明文
    
  2. Https在握手過程中采用非對稱加密協定雙方數據傳輸中使用的密鑰,具體過程如圖示,Client端拿到Server端的公鑰后,生成一個隨機密鑰,密鑰采用公鑰加密后傳給Server端,Server可以采用私鑰解密,至此,Client Server雙方都持有了新的數據傳輸密鑰;

  3. 實際的數據傳輸采用了新的實時生成的密鑰進行加密傳輸,這種數據傳輸屬于對稱加密

Https如何保證安全

Https是在Http基礎上進行數據傳輸的協議,其本質是Http層上面加了一個安全層,稱之為TLS。TLS也是SSL的升級版。其主要提供三個基本服務:

  1. 加密
  2. 身份驗證
  3. 消息完整性校驗

加密
詳細加密過程在第一節中講到,通過這種機制保證了握手階段密鑰的協定,通過新的密鑰保證了數據傳輸過程中的安全

身份驗證
在TLS握手過程中服務端會提供給客戶端它的證書。這個證書可不是隨意生成的,而是通過指定的權威機構申請頒發的。服務端如果能夠提供一個合法的證書,說明這個服務端是合法的,可以被信任。身份驗證過程就是證書鏈的驗證過程。

  1. 客戶端獲取到了站點證書,拿到了站點的公鑰;
  2. 要驗證站點可信后,才能使用其公鑰,因此客戶端找到其站點證書頒發者的信息;
  3. 站點證書的頒發者驗證了服務端站點是可信的,但客戶端依然不清楚該頒發者是否可信;
  4. 再往上回溯,找到了認證了中間證書商的源頭證書頒發者。由于源頭的證書頒發者非常少,我們瀏覽器之前就認識了,因此可以認為根證書頒發者是可信的;
  5. 一路倒推,證書頒發者可信,那么它所頒發的所有站點也是可信的,最終確定了我們所訪問的服務端是可信的;
  6. 客戶端使用證書中的公鑰,繼續完成TLS的握手過程。

Https中間人攻擊與防范

所謂中間人攻擊,指的是整個網絡請求被中間人所劫持,Client信任了中間人證書,傳輸請求被中間人接管,中間人將請求解析之后重新發送給Server端。對于Server端來講,中間人是實際請求的Client端,對于Client端來講,中間人是實際請求的Server端。

Charles如何抓HTTPS包,回想一下這個過程,本質就是中間人攻擊方式。其核心就是將私有CA簽發的數字證書安裝到手機中并且作為受信任證書保存,然后Charles接管整個傳輸過程,實現對數據的完全掌握。

中間人攻擊的原因在于:沒有對服務端證書及域名做校驗或者校驗不完整。

App中防范中間人攻擊主要要考慮兩個地方:

  1. 網絡請求中的證書、域名強校驗,針對安全性要求比較高的APP,如銀行類App,可以采用預制證書的方式,只有服務端證書和本地證書完全一致才能進行網絡請求,這種方式還需要考慮到證書過期如何更新問題,具體可以通過網絡層面的封裝來解決;除了預制證書,還可以考慮對證書和域名的強校驗來保證安全性;
  2. WebView中的Https安全問題:WebViewClient中的重載方法, 如果直接忽略SSL錯誤,可采用handler.proceed();繼續加載網絡,安全的措施是在收到錯誤之后強校驗證書,再決定是否加載網頁
 @Override
 public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            String channel = "";
            ApplicationInfo appInfo = null;
            try {
                appInfo = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
                channel = appInfo.metaData.getString("TD_CHANNEL_ID");
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
            if (!TextUtils.isEmpty(channel) && channel.equals("play.google.com")) {
                final AlertDialog.Builder builder = new AlertDialog.Builder(context);
                String message = context.getString(R.string.ssl_error);
                switch (error.getPrimaryError()) {
                    case SslError.SSL_UNTRUSTED:
                        message = context.getString(R.string.ssl_error_not_trust);
                        break;
                    case SslError.SSL_EXPIRED:
                        message = context.getString(R.string.ssl_error_expired);
                        break;
                    case SslError.SSL_IDMISMATCH:
                        message = context.getString(R.string.ssl_error_mismatch);
                        break;
                    case SslError.SSL_NOTYETVALID:
                        message = context.getString(R.string.ssl_error_not_valid);
                        break;
                }
                message += context.getString(R.string.ssl_error_continue_open);

                builder.setTitle(R.string.ssl_error);
                builder.setMessage(message);
                builder.setPositiveButton(R.string.continue_open, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        handler.proceed();
                    }
                });
                builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        handler.cancel();
                    }
                });
                final AlertDialog dialog = builder.create();
                dialog.show();
            } else {
                handler.proceed();
            }
        }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,362評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,013評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,346評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,421評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,146評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,534評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,585評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,767評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,318評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,074評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,258評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,828評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,486評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,916評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,156評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,993評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,234評論 2 375