想深入瞭解一下HTTPS的原理,於是抓包研究了一下,我的理解是這樣的:在開始的hello過程中協商出一個雙方都支持的加密演算法(對稱加密演算法),接著伺服器向客戶端發送自己的證書,然後雙方利用DH交換用於加密後續通信的祕鑰,最後雙方用協商的加密演算法和祕鑰開始加密通信。讓我疑惑的是,伺服器發給客戶端的證書在祕鑰交換過程中似乎並沒有起到什麼作用(客戶端只用來驗證正在訪問的網站的身份是否真實?),上面的加密演算法協商和祕鑰交換過程都是可以被中間人攻擊的,https是不是也有可能受到中間人攻擊?不知道我理解的是不是有問題,有沒有搞安全的大佬幫忙解答一下,謝謝!


你最終相信的其實是windows自帶的一個「全球靠譜證書發布者名單」。在這些名單裡面的人發布的證書你也會跟著相信,這是一個信任鏈。之前我國的一個發布者就因為濫發證書,被windows一個補丁從列表裡拿掉了(所以得更新,不然要遭重)。

等你確定一個https網站是可信的之後,後面通信建立起來別人就不能偷聽了,除非是運行在你機器裏的木馬。中間人攻擊的話就會對不上證書得描述,這就是為什麼它要濫發證書,就是為了騙你,好中間人攻擊。


伺服器發給客戶端的證書在祕鑰交換過程中似乎並沒有起到什麼作用(客戶端只用來驗證正在訪問的網站的身份是否真實?)

上面的加密演算法協商和祕鑰交換過程都是可以被中間人攻擊的,https是不是也有可能受到中間人攻擊?

第一個問題,你已經回答了,客戶端用證書來驗證正在訪問的網站是否真實。這個其實很重要,你記得支付寶網站是http://www.alipay.com,要往裡面存錢,這證書可以保證當前訪問的真的是它。因為證書和域名綁定,並且由根證書機構簽名確認。那麼這個根證書機構是哪兒來的?chrome、firefox乃至微軟系統裡面都默認帶的。大家都被迫選擇信任這些根證書機構列表以及他們簽發的證書,支付寶的證書就是由這些根證書機構簽發的。所以,沒有無緣無故的信任(想說區塊鏈的滾粗),這就是證書的信任鏈——所以黑客想去攻擊這些根證書機構,如果得手了,可以簽發證書用來給釣魚網站、惡意病毒簽名,也可以去偷第三方公司獲得的證書。

第二個問題,你覺得密鑰交換過程可以被中間人攻擊,那就是拍腦袋的想法了,你攻擊一個給我看看?拿最簡單的RSA密鑰交換來說,過程如下:客戶端拿到了服務端證書並且基於CA驗證了真實性,取出服務端公鑰,然後生成一個足夠長的串作為會話密鑰用服務端的公鑰加密,傳給服務端。服務端解密得到會話祕鑰,然後雙方用這個通訊。

假設你嗅探了服務端發證書的過程,只能拿到公鑰,基於非對稱加密的基本原理,算不出來私鑰,拿到了公鑰卵用都沒有。假設你劫持了服務端發證書用自己的公鑰替換,證書有CA簽名的,客戶端一驗算簽名就知道證書被改了。假設你嗅探了客戶端發過去的加密後的會話祕鑰,一樣的基於非對稱演算法基本原理你解不出來。假設你劫持了客戶端發過去的數據,因為是加密的解不開,你想篡改最多隻能瞎JB篡改密文,那麼服務端的私鑰去解密發現解不開。

最簡單的RSA密鑰交換你都毫無辦法,那麼為啥不用這個?因為這種模式可能會被「回溯攻擊」所影響。簡單的說,哪一天有人通過物理攻擊(比如說把刀架在你脖子上)拿到了你的證書,而他又保存了以前所有的通訊過程(加密後的),現在就可以全部解密了。同時我們可以看到,安全研究人員對安全做到了多麼偏執的地步。於是,大神們搞出了ECDHE之類的密鑰交換演算法,不受「回溯攻擊」影響。可惜ECDHE又會受中間人攻擊影響,所以它需要RSA做簽名來配合。

看看我的系統:

可以看到,密鑰交換演算法那裡有ECDHE_RSA,不可能被中間人劫持。

BTW,HTTPS網站是不是完全不會被攻擊呢?當然不是。TLS協議雖然比較好,但是軟體是人寫的,有時候會出現一些漏洞,比如著名的心臟滴血。也有的網站配置錯誤,不是全站HTTPS,也沒配置好HSTS,可能會遭受ssltrip2之類的降級攻擊。還有的客戶端本身就感染了木馬,那麼什麼加密都救不了。


服務端向客戶端發放自己證書(公鑰)後,客戶端就會使用這個證書的公鑰加密後續過程(密碼協商過程),直到協商出本次使用的密碼。

如果服務端沒有自己證書對應的私鑰,立即就歇了。

這個流程整體上,客戶端可以確定伺服器是這個證書的合法擁有者。

而證書本身是否被信任,則取決於證書的簽發信任鏈。

HTTPS是可以被中間人攻擊的。HTTPS代理有一種(例如mitmweb)就是通過在終端添加一個信任的根證書,在終端訪問任何一個HTTPS網站的時候,立即動態生成一個對應這個域名的證書給代理伺服器,實現代理伺服器內的明文處理。


證書裡面簽的就是公鑰和域名、IP等的對應關係,是上一級的CA拿自己的私鑰簽署的,證明這個公鑰的確屬於這個域名,可以用這一家CA的公鑰驗證。沒有證書的話中間人攻擊,半路替換什麼密鑰都可以,只要不讓你偶爾發現真正的密鑰和你現在用的不一樣,不會露馬腳

所以最終產生了一個雞生蛋蛋生雞的問題,CA一級一級信任上去怎麼是個頭,所以操作系統裏預裝了一些全球最德高望重的root CA,因為是系統預裝的,所以必須信任,這樣就解決了信任鏈的源頭問題。

root CA受騙簽了假證書是很重大的事故,很少發生,次級CA公鑰對應的私鑰泄露導致第三方可以偽造證書也是大事故。但系統預裝的根CA列表可以被硬體或者軟體廠商修改。美帝良心廠還出過為了給https鏈接插播廣告,給系統預裝根證書,結果私鑰是靜態的,還保存在用戶電腦裏,導致被黑客提取出來進行大範圍中間人攻擊的事情

所以千萬不要給自己常用的系統亂裝根證書


雲霸天下SSL證書」為大家關於SSL證書的作用及好處進行介紹

(1)網站實現加密傳輸

用戶通過http協議訪問網站時,瀏覽器和伺服器之間是明文傳輸,這就意味著用戶填寫的密碼、帳號、交易記錄等機密信息都是明文,隨時可能被泄露、竊取、篡改,被黑客加以利用。

SSL證書有什麼作用?網站安裝SSL證書後,使用https加密協議訪問網站,可激活客戶端瀏覽器到網站伺服器之間的"SSL加密通道"(SSL協議),實現高強度雙向加密傳輸,防止傳輸數據被泄露或篡改。

(2)認證伺服器真實身份

SSL證書有什麼作用?釣魚欺詐網站泛濫,用戶如何識別網站是釣魚網站還是安全網站?網站部署全球信任的SSL證書後,瀏覽器內置安全機制,實時查驗證書狀態,通過瀏覽器向用戶展示網站認證信息,讓用戶輕鬆識別網站真實身份,防止釣魚網站仿冒。

安裝SSL證書好處

(1)保障用戶隱私信息安全

SSL證書讓網站實現加密傳輸,可以很好的防止用戶隱私信息如用戶名、密碼、交易記錄、居住信息等被竊取和纂改。比如電商網站安裝SSL證書,就可以有效保障你登錄電商網站支付時提交的用戶名密碼的安全。

(2)幫助用戶識別釣魚網站

SSL證書可以認證伺服器真實身份,可以有效的區別釣魚網站和官方網站。網站部署全球信任的SSL證書後,瀏覽器內置安全機制,實時查驗證書狀態,通過瀏覽器向用戶展示網站認證信息,讓用戶輕鬆識別網站真實身份,防止釣魚網站仿冒。

(3)利於網站SEO優化

因為部署了SSL證書的網站相比沒有部署SSL證書的網站更加可信,更加安全,可以有效的保障用戶的利益不受侵害。因此搜索引擎如谷歌,百度站在確保用戶信息安全的角度,都在大力倡導網站部署SSL證書實現https加密訪問。在搜索、展現、排序方面也給予部署了SSL證書網站優待。

(4)提升公司品牌形象和可信度


前言

感謝偉大的數學家和密碼學家們,讓我們的網路處於一個相對安全的環境。

最近整理了一下 HTTPS 相關的知識,本文中所有的分析是基於 TLS1.2 版本。

WebTrust

WebTrust 是由全球兩大著名註冊會計師協會 AICPA(美國註冊會計師協會)和 CICA(加拿大註冊會計師協會)共同制定的安全審計標準,主要對互聯網服務商的系統及業務運作邏輯安全性、保密性等共計七項內容進行近乎嚴苛的審查和鑒證。只有通過 WebTrust 國際安全審計認證的根證書才能預裝到主流的瀏覽器中。

CA機構

CA機構定義

證書頒發機構(CA, Certificate Authority)即頒發數字證書的機構。是負責發放和管理數字證書的權威機構,並作為電子商務交易中受信任的第三方,承擔公鑰體系中公鑰的合法性檢驗的責任。

有哪些CA機構

目前全球主流的 CA 機構有 Comodo 、Symantec、GeoTrust、DigiCert、Thawte、GlobalSign、RapidSSL 等,其中 Symantec、GeoTrust 都是 DigiCert 機構的子公司,目前市場上主流的 SSL 證書品牌是 Comodo 證書、Symantec 證書、GeoTrust 證書、Thawte 證書和 RapidSSL 證書,還有一些不知名的證書機構也是可以頒發數字證書的。

國內的 CA 機構主要有中國金融認證中心(CFCA)、沃通(WoSign)、數安時代(GDCA)和安信證書(AnTruet)等。

對稱加密

定義

採用單鑰密碼系統的加密方法,同一個密鑰可以同時用作信息的加密和解密,這種加密方法稱為對稱加密,也稱為單密鑰加密。

常用加密演算法

DES、AES、RC2、RC4、RC5 等

示例

public class DES {

public static String encrypt(String content, String key) {
try {
byte[] encryptionBytes = content.getBytes("UTF-8");
SecureRandom random = new SecureRandom();
DESKeySpec desKey = new DESKeySpec(key.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secureKey = keyFactory.generateSecret(desKey);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, secureKey, random);
byte[] encryptionBase64Bytes = Base64.getEncoder().encode(cipher.doFinal(encryptionBytes));
return new String(encryptionBase64Bytes);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

public static String decrypt(String content, String key) {
try {
byte[] decryptionBytes = Base64.getDecoder().decode(content);
SecureRandom random = new SecureRandom();
DESKeySpec desKey = new DESKeySpec(key.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secureKey = keyFactory.generateSecret(desKey);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE, secureKey, random);
return new String(cipher.doFinal(decryptionBytes), "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}

return null;
}

public static void main(String[] args) {

final String key = "this_is_key";
String content = "九點下班";

String encryptStr = DES.encrypt(content, key);
System.out.println("加密:" + encryptStr);

String decryptStr = DES.decrypt(encryptStr, key);
System.out.println("解密:" + decryptStr);
}
}

1、李雷想要給韓梅梅發送消息,他們約定使用對稱加密的方式把消息進行加密

2、李雷用密鑰把消息加密然後發送給韓梅梅

3、韓梅梅用同一個密鑰解密,然後看到李雷發送給自己的消息

可以看到使用上面的方式,一旦密鑰泄漏,消息就很容易被破解

非對稱加密

定義

對稱加密演算法在加密和解密時使用的是同一個祕鑰,非對稱加密演算法需要兩個密鑰來進行加密和解密,這兩個密鑰是公開密鑰(public key,簡稱公鑰)和私有密鑰(private key,簡稱私鑰)。

常用加密演算法

RSA、ECC 等

示例

public class RSA {

private static Cipher cipher;

static {
try {
cipher = Cipher.getInstance("RSA");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
}
}

public static void generateKeyPair() {
try {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
String publicKeyStr = getKeyString(publicKey);
String privateKeyStr = getKeyString(privateKey);

System.out.println("publicKeyStr :" + publicKeyStr);
System.out.println("privateKeyStr :" + privateKeyStr);
} catch (Exception e) {
e.printStackTrace();
}
}

public static PublicKey getPublicKey(String key) throws Exception {
byte[] keyBytes = Base64.decode(key);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
return publicKey;
}

public static PrivateKey getPrivateKey(String key) throws Exception {
byte[] keyBytes = Base64.decode(key);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
return privateKey;
}

public static String getKeyString(Key key) {
byte[] keyBytes = key.getEncoded();
return Base64.encode(keyBytes);
}

public static String encrypt(String publicKey, String content) {
try {
cipher.init(Cipher.ENCRYPT_MODE, getPublicKey(publicKey));
byte[] encryptBytes = cipher.doFinal(content.getBytes());
return Base64.encode(encryptBytes);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

public static String decrypt(String privateKey, String content) {
try {
cipher.init(Cipher.DECRYPT_MODE, getPrivateKey(privateKey));
byte[] decryptBytes = cipher.doFinal(Base64.decode(content));
return new String(decryptBytes);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

public static void main(String[] args) {

// generateKeyPair();

final String publicKey = "使用generateKeyPair生成";
final String privateKey = "使用generateKeyPair生成";

String content = "九點下班";
String encryptStr = encrypt(publicKey, content);
System.out.println("加密:" + encryptStr);
String decryptStr = decrypt(privateKey, encryptStr);
System.out.println("解密:" + decryptStr);
}
}

1、李雷想要給韓梅梅發送消息,他們約定使用非對稱加密的方式把消息進行加密

2、李雷首先要得到韓梅梅的公鑰

2、李雷用韓梅梅的公鑰把消息加密然後發送給韓梅梅

3、韓梅梅用自己的私鑰解密,然後看到李雷發送給自己的消息

韓梅梅給李雷發送消息同理。

數字簽名

數字簽名(Digital Signature)是一種功能類似寫在紙上的普通簽名、但是使用了公鑰加密領域的技術,以用於鑒別數字信息的方法。一套數字簽名通常會定義兩種互補的運算,一個用於簽名,另一個用於驗證。通常我們使用公鑰加密,用私鑰解密。而在數字簽名中,我們使用私鑰加密(相當於生成簽名),公鑰解密(相當於驗證簽名)。我們可以直接對消息進行簽名(即使用私鑰加密,此時加密的目的是為了簽名,而不是保密),驗證者用公鑰正確解密消息,如果和原消息一致,則驗證簽名成功。但通常我們會對消息的散列值簽名,因為通常散列值的長度遠小於消息原文,使得簽名(非對稱加密)的效率大大提高。注意,計算消息的散列值不是數字簽名的必要步驟。

TLS與SSL

TLS(傳輸層安全性協議:Transport Layer Security)及其前身 SSL(安全套接層:Secure Sockets Layer)是一種安全協議,目的是為互聯網通信提供安全及數據完整性保障。

我們訪問我的個人博客 https://democome.com/,然後用 WireShark 抓包看下 TLS 握手的過程。

WireShark抓包TLS握手

TLS 握手有 RSA 握手、ECDH 握手。通過我下面的抓包分析,下面的示例中使用的是 ECDH 握手。使用 WireShark 進行 ip 過濾

ip.dst == 185.199.109.153 or ip.src == 185.199.109.153

TLS 握手過程如下圖,我們現在只關注 Protocol 為 TLSv1.2 的抓包信息:

通過上面的圖我們可以發現,TLS 的握手過程主要分為以下幾步。

  • Client Hello
  • Server Hello
  • Certificate
  • Server Key Exchange
  • Client Key Exchange

其中涉及到了對稱加密、非對稱加密等演算法,我們來對每一步進行分析。

Client Hello

瀏覽器發送給伺服器

我們需要關注以下內容:

  • TLS版本:1.2
  • 隨機數:Radnom
  • 瀏覽器支持的加密套件:Cipher Suites

可以看到瀏覽器支持的 Cipher Suites 有17種,伺服器會從中選擇一個。隨機數會在最後計算主密鑰(master key)即對稱加密所使用的密鑰時使用。

Server Hello

伺服器發送給瀏覽器

  • 隨機數:Radnom
  • 伺服器選擇的加密套件:Cipher Suite

可以看到伺服器選擇的加密套件是:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

我們看下一每一部分的含義

ECDHE:密鑰協商演算法

RSA:證書公鑰加密演算法

AES_128:對稱加密演算法、AES的密碼長度

GCM:AES加密模式

SHA256:驗證消息的消息摘要演算法(哈希演算法)

Certificate

伺服器發送給瀏覽器

在 Server Hello 過程中伺服器已經選擇好了加密套件。伺服器下發證書,攜帶了 CA 證書鏈和證書的公鑰。在證書鏈最上層有一個根 CA 證書,這個證書存儲在瀏覽器或者操作系統中,由系統直接信任的。

我們先在瀏覽器中看一下證書鏈如下:

然後再看一下 macOS 系統根證書,可以發現最上層的證書是系統信任的。

瀏覽器驗證伺服器證書的過程如下,首先找到找到 http://democome.com 證書的中級證書頒發機構 Lets Encrypt Authority X3 ,然後再往上找直到根證書,這裡就是 DST Root CA X3。

然後從根證書開始往下去驗證數字簽名。在這個例子中用 DST Root CA X3 的公鑰驗證 Lets Encrypt Authority X3 證書的數字簽名。再用 Lets Encrypt Authority X3 證書的公鑰驗證伺服器證書 http://democome.com 的數字簽名。如果在驗證過程中任何一個環節失敗,那麼這個證書就是不合法的。

Certificate 這一步驟信息如下

證書的公鑰如下圖:

證書籤名如下圖:

證書的簽名用來確保證書沒有被篡改過。

Server Key Exchange

伺服器發送給瀏覽器

伺服器選擇的加密套件為:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 其中 ECDHE(Elliptic Curve Diffie Hellman Ephemeral)用於密鑰協商。這裡涉及到了橢圓曲線加密。橢圓曲線密碼(Elliptic Curve Cryptography,縮寫:ECC)是一種基於橢圓曲線數學的公開密鑰加密演算法。ECC 的主要優勢是在某些情況下它比其他的演算法(比如 RSA 加密演算法)使用更小的密鑰並提供相當的或更高等級的安全。

以上 Server Key Exchange 內容我們重點關注 EC Diffie-Hellman Server Params,可以看到 Named Curve 這裡選擇的是 x25519 這條曲線。它的原理可以簡單理解如下:

還是李雷和韓梅梅要寫信

1、李雷用自己的私鑰 [公式] 算出橢圓曲線上點 [公式],然後把基點 [公式][公式] 發送給韓梅梅

2、韓梅梅用自己的私鑰 [公式] 算出橢圓曲線上點 [公式] 發送給李雷

3、根據橢圓曲線計算規則雙方共同計算出的 [公式] 是相同的。

這樣就可以進行對稱加密了,並且加密的密鑰沒有在網路上傳遞過。其實這個計算出來的 [公式] 也不是最終對稱加密的密鑰這裡可以理解為 premaster key ,最終還會用瀏覽器和伺服器雙方的隨機數再進行一個計算(PRF)得到真正的對稱加密密鑰 master key。

上圖中的 Pubkey 就可以理解為伺服器計算的橢圓上一點。

以下內容主要是橢圓曲線加密演算法的一些數學原理,不感興趣可以忽略,直接到 Client Key Exchange 這一步驟。

DH 演算法

DH(Diffie–Hellman key exchange)它可以讓雙方在完全沒有對方任何預先信息的條件下通過不安全信道創建起一個密鑰。這個密鑰可以在後續的通訊中作為對稱密鑰來加密通訊內容。

簡單解釋一下,假如通信的雙方是 李雷 和 韓梅梅

前提條件:

  • [公式] 是 李雷 的私鑰,[公式] 是 韓梅梅 的私鑰。
  • [公式] 是一個質數,是公開的
  • [公式][公式] 的一個原根,是公開的

協商過程:

第一步:李雷 根據自己的私鑰 [公式] 計算出自己的 公鑰 [公式]

第二步:李雷 將 [公式][公式][公式] 發送給 韓梅梅

第三步:韓梅梅 根據自己的私鑰 [公式] 計算出自己的 公鑰 [公式]

第四步:韓梅梅 把自己的公鑰 [公式] 發送給 李雷

第五步:李雷 計算對稱加密的密鑰 [公式]

第六步:韓梅梅 計算對稱加密的密鑰 [公式]

由上圖的推導可知最終計算的 [公式] 是相同的。

具體例子:

李雷 與 韓梅梅 協定使用 [公式]以及[公式]。 李雷 的私鑰 [公式], 計算[公式]並發送給 韓梅梅。 [公式] 韓梅梅 的私鑰 [公式], 計算[公式] 並發送給 李雷。 [公式] 李雷 計算 [公式] [公式] 韓梅梅 計算 [公式] [公式]

可以看到對稱加密的密鑰 [公式] 並沒有在 李雷 和 韓梅梅 之間傳輸,但是計算出來的結果是一樣的。

ECC演算法

橢圓曲線密碼(Elliptic Curve Cryptography,縮寫:ECC)是一種基於橢圓曲線數學的公開密鑰加密演算法。ECC的主要優勢是在某些情況下它比其他的演算法(比如RSA加密演算法)使用更小的密鑰並提供相當的或更高等級的安全。

橢圓曲線的方程如下:

[公式]

橢圓曲線的函數圖像如下:

[公式]

[公式]

可以看到是關於 X 軸對稱的。

橢圓曲線運算

過曲線上 A、B 兩點與橢圓曲線交與點 C,點 C 關於 A 軸做對稱,與橢圓曲線的交點定義為 A+B。

考慮加法的一種特殊情況,如果 A = B,也就A(B)是橢圓曲線的切點,這個時候在重複上面的運算得到 A+A = 2A。

A 關於 X 軸做對稱得到的點定義為 -A。

有了以上 [公式][公式] 的運算,如果已知橢圓曲線上一點 [公式] ,我們可以求出 [公式][公式][公式][公式] 、... [公式],但是反過來如果我們已知 [公式] ,要想求出 [公式] 是非常困難的。

橢圓曲線的有限域

橢圓曲線加密演算法並非使用實數域,而是使用有限域,那麼我們把橢圓曲線定義在有限域上。

[公式] 表示橢圓曲線方程 [公式] ,在有限域 [公式] 中,表示所有在同餘( [公式] )意義上滿足該方程的 [公式] 點。

舉例:加入我們的曲線是 [公式][公式] 。那麼 [公式]

[公式] 滿足 [公式][公式]

所以點 [公式] 在曲線上。

以上是離散化之後的點。利用橢圓曲線進行加密通信的過程如下(這裡給出推理過程,涉及到的運算比較複雜,需要的數學知識比較多,我還在研究中):

1、李雷選擇一條曲線 [公式],取橢圓曲線上一點 [公式] 作為基點。

2、李雷選擇一個私鑰 [公式],然後生成公鑰 [公式]

3、李雷把 [公式] 、公鑰 [公式] 和 基點 [公式] 傳給韓梅梅

4、韓梅梅以上信息,把明文編碼到 [公式] 上一點 [公式],併產生一個隨機數 [公式]

5、韓梅梅計算 [公式][公式]

6、韓梅梅把 [公式] 傳給李雷

7、李雷收到信息後,計算 [公式] 結果就是點 [公式]

因為 [公式]

數學概念

有限域

在數學中,有限域(finite field)是包含有限個元素的域。與其他域一樣,有限域是進行加減乘除運算都有定義並且滿足特定規則的集合。有限域最常見的例子是當 [公式] 為素數時,整數對 [公式] 取模。有限域的元素個數稱為它的

數學裡面的羣是一類定義了二元運算(我們稱之為加法,用符號+表示)的集合。如果想讓集合

變成一個羣,我們必須定義滿足如下四條性質的加法:

1、封閉性:如果 [公式][公式] 屬於 [公式],那麼 [公式] 也屬於 [公式]

2、結合律:[公式]

3、存在單位元(註:在二元運算中,單位元指與任意元素運算不改變其值的元素,以實數為例,乘法單位元為1,加法單位元為0)[公式] 使得 [公式]

4、每個元素都存在逆元素,也即對於任意元素 [公式] 存在 [公式] 使得 [公式]

如果我們添加第五條要求:

5、交換律:[公式]

那麼這個羣就是阿貝爾羣。

Curve25519

在密碼學中,Curve25519 是一種橢圓曲線,被設計用於橢圓曲線迪菲-赫爾曼(ECDH)密鑰交換方法。它是不被任何已知專利覆蓋的最快 ECC 曲線之一。

Curve25519 橢圓曲線方程為:[公式],使用基點 [公式]

ECDH

還以 李雷 和 韓梅梅 為例,把 DH 的交換內容改為曲線上的點

當我們選擇 Curve25519 是一種橢圓曲線時,參數是確定的,G 也是確定的,所以只交換雙方的公鑰即可。

Client Key Exchange

瀏覽器發送給伺服器

同理,這裡的 Pubkey 就可以理解為瀏覽器計算的橢圓上一點。這一步和 Server Key Exchange 類似,都是為了計算對稱加密的密鑰。

對稱加密通信

有了上面的基礎,瀏覽器可以計算出一個對稱加密密鑰,伺服器可以計算出一個對稱加密密鑰,儘管這兩個密鑰沒有在網路上傳輸,但是可以保證這兩個密鑰是相同的。這樣使用這個密鑰進行加密就可以在網路上進行傳輸了。

以上就是關於 TLS 握手的基本過程,保證了數據在網路上傳遞的安全性。

X.509

X.509 是密碼學裡公鑰證書的格式標準。X.509 證書已應用在包括 TLS/SSL 在內的眾多網路協議裏,同時它也用在很多非在線應用場景裏,比如電子簽名服務。X.509 證書裏含有公鑰、身份信息(比如網路主機名,組織的名稱或個體名稱等)和簽名信息(可以是證書籤發機構 CA 的簽名,也可以是自簽名)。對於一份經由可信的證書籤發機構簽名或者可以通過其它方式驗證的證書,證書的擁有者就可以用證書及相應的私鑰來創建安全的通信,對文檔進行數字簽名。

工具

在線畫圖工具

參考文章

SSL證書CA機構

數字證書與網路安全

數字簽名是什麼?

橢圓曲線加密

Curve25519

橢圓曲線密碼學的簡單介紹

TLS的握手流程

再談HTTPS

ECC橢圓曲線加解密原理詳解(配圖)

ECC橢圓曲線加密演算法:介紹

新手上路:實數上的橢圓曲線和羣論

密碼學基礎2:橢圓曲線密碼學原理分析

HTTPS 溫故知新(五) —— TLS 中的密鑰計算

有限域


基於證書鏈(信任鏈)。因為你本地有根證書,只要根證書相信的證書,已經相信的證書相信的證書...瀏覽器都會相信。

可以看看rfc5246,也提到了一些中間人攻擊的場景。


HTTPS證書一個很大的用途就是防止客戶端找錯人(被人騙)


推薦閱讀:
相關文章