段鐵興
通信風險
1.竊聽風險(eavesdropping):第三方可以獲知通信內容。
2.篡改風險(tampering):第三方可以修改通信內容。
3.冒充風險(pretending):第三方可以冒充他人身份參與通信。
風險防范
1.信息加密傳輸,第三方無法竊聽。
2.增加校驗機制,一旦被篡改,通信雙方會立刻發現。
3.配備身份證書,防止身份被冒充。
哈希
哈希也叫散列,是把任意長度的輸入通過散列算法變換成固定長度的輸出,該輸出就是散列值,也叫摘要。哈希是一種壓縮映射,通常不可逆。
這種轉換是一種壓縮映射。也就是,散列值的空間通常遠小于輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值,但如果輸出的位數足夠,不同輸入散列成相同輸出的概率非常小。
簡單地說,散列就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的過程。散列是不可逆的,也就無法通過輸出還原輸入,此特性常被用于密碼保存。
SHA-512,MD5等都是著名的散列函數,MD5生成的散列碼是128位,甚至MD5就是哈希的同名詞。
散列的作用
1.散列可用于保存密碼,明文保存密碼是危險的。通常我們把密碼哈希加密之后保存,這樣即使泄漏了密碼,因為是散列后的值,也無法推導出密碼明文(字典攻擊難以破解)。驗證的時候,只需對密碼做同樣的散列,對比散列后的輸出和保存的密碼散列值,就可以驗證同一性。
2.可用于驗證下載文件的完整性以及防篡改,比如網站提供安裝包的時候,通常也同時提供MD5值,這樣用戶下載之后,可以重算安裝包的MD5值,如果一致,則證明下載到本地的安裝包跟網站提供的安裝包一致,說明網絡傳輸過程中沒有出錯。
加密
加密就是把明文變成密文的過程,解密就是反方向把密文變成明文。
比如著名的凱撒密碼,就是把每個字對應到另一個,這樣的話,只要有密碼本,就能對照完成加解密。比如最簡單的,對于26個英文字母,每個字母右移3個,abc變成def,這也是一種加密,當然這種加密很簡單,很容易被破譯。而諸如高級加密標準(AES)以及三重數據加密算法(3DES)則被公認為很難破解。
對稱加密
對稱加密就是加解密的密鑰一樣,優點是快,這也是傳統的加密方式,像AES,3DES都是對稱加密。
非對稱加密
非對稱加密用于加解密的密鑰不一樣,有2個密鑰:公鑰和私鑰,公鑰可以公開,私鑰妥善保管。RSA,ECC,DH這些都是非對稱加密。
非對稱加密很慢,有多慢?相比對稱加密慢1 000倍,因為慢,所以它常用于密鑰協商(Handshake),協商出會話密鑰后,再用對稱密鑰加密通信數據。
1976年,Whitfield Diffie和Martin Hellman首次提出了非對稱加密的概念,該算法被稱為Diffie-Hellman密鑰交換。在1978年,麻省理工學院的Ron Rivest,Adi Shamir,Leonard Adleman發表了RSA算法。這些都可以被視為非對稱加密的基礎。
非對稱加密也稱為公鑰基礎結構,又稱PKI。非對稱加密算法用私鑰加密,用公鑰解密,或者用公鑰加密,用私鑰解密。
證書
CA是數字證書中心,服務器需要找CA做認證,讓CA給自己頒布數字證書,數字證書一般包含服務的一些信息以及服務器的公鑰,通過CA的私鑰加密后,產生的數字證書,因為CA的權威性,且它的公鑰天下皆知,所以,如果能用CA的公鑰解開證書,那便可證明該證書一定是CA頒發的,要不然不會有CA的私鑰,也沒法產生可用CA公鑰解密的證書。
所以,由此可見,數字證書用到了非對稱加密。
數字簽名
日常生活中也有簽名,每個人的筆跡不一樣,刷卡消費后在賬單簽上名,服務員校驗過之后保存下來,如果賴賬,便可以有簽名為證,因為別人寫的字跟你的筆跡終有差別。
那數字簽名是什么呢?比如a發一封email,接收方怎么證明這封信是a寫的?本質上,數字簽名也是利用了非對稱加密。
前面講了,非對稱加密有公鑰和私鑰,如果發生方用私鑰加密,然后接收方用發送方的公鑰可以解密,便可以證明是從某發送方發送的,因為別人拿不到你的私鑰,也無法用你的私鑰加密,你不能抵賴。
數字簽名通常先對內容算哈希,產生內容摘要,再用私鑰加密,得到簽名。
密鑰協商
下面舉一個例子來說明這幾個問題:
張三有2把鑰匙,一把公鑰,公告天下;一把私鑰,妥善保管,只有自己知道,很明顯,非對稱加密。
李四給張三寫信,寫完之后,用張三的公鑰加密,通過郵局寄(發送電子郵件)給張三,即使郵遞員拆開信封看(電子郵件被網絡劫持),他也看不懂,因為內容是密文,只有張三的密鑰才能解密。
張三收到信后,用私鑰解密就可以正常閱讀。
現在張三要給李四回信,寫完后,用Hash函數生成摘要digest。然后張三,再用私鑰對摘要加密,生成數字簽名signature。然后把簽名附在信的下面,一起發給李四。
過程是:信明文- >hash- >digist- >私鑰加密- >signature。
李四收到回信后,用張三的公鑰對數字簽名解密,得到摘要,由此證明,信確實是張三發出的,為什么?因為如果不是張三發的,那寫信的人就沒有張三私鑰,用別的私鑰加密得到的簽名,是無法用張三的公鑰解開的。
李四,再對信的內容做Hash,得到摘要,與上一步得到的摘要對比,如果一致,則證明信的內容沒有被修改過,信的內容是完整的。
復雜的情況出現了。
王五,用自己的公鑰替換李四保存的張三的公鑰,也就是王五欺騙了李四,李四誤把王五的公鑰當張三的公鑰,這樣一來,王五就能冒充張三給李四寫信(王五用自己的私鑰加密)。
問題是李四不能確信自己保存的公鑰真的是張三的公鑰。如果客戶端電腦上存的工商銀行官網的公鑰,實際上是騙子公司的公鑰,那就麻煩大了。
怎么辦?讓張三去認證中心CA,為公鑰做認證,怎么做呢?CA中心用自己的私鑰,對張三的公鑰和其他相關信息一起加密,生成數字證書。
張三拿到數字證書后,給李四回信,在簽名的同時,附帶上數字證書。

李四收到信之后,從CA的公鑰解開數字證書,取出張三的公鑰(一定是真的),就能放心地按之前的流程解開簽名了。
數字證書加入后,核心區別就是張三的公鑰不再保存在李四處,而是通過數字證書下發。
為什么數字證書里張三的公鑰一定是真的呢?因為CA是權威機構,假設全世界就一家(其實不止,但也不多),它的公鑰天下盡知,就是固定的串,所以能用CA公鑰解開的證書,一定是CA頒布的,因為CA用它的私鑰加密產生的證書。很明顯,非對稱加密能用于證明我是我。
密鑰交換算法
著名的DH密鑰交換算法很有意思,也很巧妙,簡而言之,就是通信雙方交換一些信息(不怕被偷看到),然后就在兩端,分布產生出一個相同的密鑰,神奇吧。
有一個很有意思的例子。
Alice和Bob要協商出一個公共的顏色,他們可以交換信息,但交換的信息,可以被偷看到,怎么辦?既能協商出公共顏色,又不能讓別人知道。
1.他們有公共的顏色,都是1毫升黃色。
2. Alice挑選一個私密的紅色,Bob選綠色,都是1毫升。只有自己知道,不會告訴別人。
3. Alice把黃色和紅色混合在一起,Bob把黃色和綠色混合在一起,各為2毫升。
4.他們把自己混合后的2毫升顏色液體,發給對方。
5.用自己的1毫升私密顏色液體,跟從對方那里收到的2毫升液體混合,下面就是見證奇跡的顏色的時刻,他們得到了相同的顏色,而第三方并不能通過偷看他們傳遞的數據知道他們最終得到的顏色(基于一個假設)。密鑰交換算法的原理跟這個差不多,網上有大量的資料講述這個問題,個人覺得理解了上面的例子,再看ECDH便也不難了。
眾所周知http是互聯網協議,但是它不夠安全,所以后面有改進版的https,其實就是多了一個TLS,這個是傳輸層加密。本質上,就是通過handshake,協商出一個會話密鑰,后面的數據傳遞,都用這個密鑰做對稱加解密。我們經常講安全通道,其實也就是協商出一個會話密鑰。