通信風(fēng)險(xiǎn)
風(fēng)險(xiǎn)防范
?哈希(Hash)哈希也叫散列,是把任意長度的輸入通過散列算法變換成固定長度的輸出,該輸出就是散列值,也叫摘要(Digest)。 哈希是一種壓縮映射,通常不可逆 這種轉(zhuǎn)換是一種壓縮映射。也就是,散列值的空間通常遠(yuǎn)小于輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值,但如果輸出的位數(shù)足夠,不同輸入散列成相同輸出的概率非常非常小。 簡單的說,散列就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的過程。 散列是不可逆的,也就是無法通過輸出還原輸入,此特性常被用于密碼保存。 SHA-512、MD5等都是著名的散列函數(shù),MD5生成的散列碼是128位,甚至MD5就是哈希的同名詞,你可以通過網(wǎng)站:https:///sha512-hash-generator/ 在線計(jì)算哈希。 散列有什么用?
加密加密就是把明文變成密文的過程,解密就是反方向把密文變成明文。 比如著名的凱撒密碼,就是把每個字對應(yīng)到另一個,這樣的話,只要有密碼本,就能對照完成加解密。比如最簡單的,對于英文26個字母,每個字母右移3個,abc變成def,這也是一種加密,當(dāng)然這種加密很簡單,很容易被破譯。 而諸如AES(高級加密標(biāo)準(zhǔn))、3DES(三重?cái)?shù)據(jù)加密算法)則被公認(rèn)為很難破解,不過山東大學(xué)女教授王小云很厲害,破解了MD5和SHA-1,迫使加密標(biāo)準(zhǔn)升級,最終當(dāng)上了院士。 對稱加密 對稱加密就是加解密的密鑰是一樣的,優(yōu)點(diǎn)是快,這也是傳統(tǒng)的加密方式,像AES、3DES都是對稱加密。 非對稱加密 非對稱加密用于加解密的密鑰不一樣,有2個密鑰,公鑰和私鑰,公鑰可以公開,私鑰妥善保管。RSA、ECC(橢圓曲線加密算法)、DH(密鑰交換算法)這些都是非對稱加密。 非對稱加密很慢,有多慢?相比對稱加密慢1000倍,因?yàn)槁?,所以它常用于密鑰協(xié)商(Handshake),協(xié)商出會話密鑰后,再用對稱密鑰加密通信數(shù)據(jù)。 1976年,Whitfield Diffie和Martin Hellman首次提出了非對稱加密的概念,該算法被稱為Diffie-Hellman密鑰交換。然后在1978年,麻省理工學(xué)院的Ron Rivest,Adi Shamir和Leonard Adleman發(fā)表了RSA 算法。這些都可以被視為非對稱加密的基礎(chǔ)。 非對稱加密也稱為公鑰基礎(chǔ)結(jié)構(gòu),又稱PKI。非對稱加密的提出是密碼學(xué)上的一次革命,影響深遠(yuǎn)。 非對稱加密算法用私鑰加密,用公鑰解密,或者用公鑰加密,用私鑰解密。 證書證書就是為了證明我是我,比如你要訪問中國銀行網(wǎng)站,但中行官網(wǎng)如何證明它是中行官網(wǎng)呢?答案就是數(shù)字證書。 CA是數(shù)字證書中心,服務(wù)器需要找CA做認(rèn)證,讓CA給自己頒布數(shù)字證書,數(shù)字證書內(nèi)一般包含服務(wù)的一些信息、以及服務(wù)器的公鑰,通過CA的私鑰加密后,產(chǎn)生的數(shù)字證書,因?yàn)镃A的權(quán)威性,且它的公鑰天下皆知,所以,如果你能用CA的公鑰解開證書,那便可證明該證書一定是CA頒發(fā)的,要不然它不會有CA的私鑰,也便沒法產(chǎn)生可用CA公鑰解密的證書。 所以,由此可見,數(shù)字證書用到了非對稱加密。 數(shù)字簽名日常生活中也有簽名,每個人的筆跡是不一樣的,你刷卡消費(fèi)后在賬單簽上大名,服務(wù)員校驗(yàn)過之后保存下來,你哪天賴賬,便可以有簽名為證,因?yàn)閯e人寫的字跟你的筆跡終有差別。 那數(shù)字簽名是什么呢?比如a發(fā)一封email,接收方怎么證明這封信是a寫的? 本質(zhì)上,數(shù)字簽名也是利用了非對稱加密。 前面講了,非對稱加密有公鑰和私鑰,如果發(fā)生方用私鑰加密,然后接收方用發(fā)送方的公鑰可以解密,那便可以證明是從某發(fā)送方發(fā)送的,因?yàn)閯e人拿不到你的私鑰,也便無法用你的私鑰加密,你不能抵賴。 數(shù)字簽名通常先對內(nèi)容算哈希,產(chǎn)生內(nèi)容摘要,再用私鑰加密,得到簽名。 密鑰協(xié)商下面舉一個例子來說明這幾個問題: 張三有2把鑰匙,一把公鑰,公告天下,一把私鑰,妥善保管,只有自己知道,很明顯,非對稱加密。 李四給張三寫信,寫完之后,用張三的公鑰加密,通過郵局寄給張三,即使郵遞員拆開信封看,他也看不懂,因?yàn)閮?nèi)容是密文,只有張三的密鑰才能解密。 張三收到信后,用私鑰解密,可以正常閱讀。 現(xiàn)在張三要給李四回信,寫完后,用hash函數(shù)生成摘要digest。 然后張三,再用私鑰對摘要加密,生成數(shù)字簽名signature。 然后把簽名附在信的下面,一起發(fā)給李四。 過程是:信明文 -> hash -> digist -> 私鑰加密 -> signature。 李四收到回信后,用張三的公鑰對數(shù)字簽名解密,得到摘要,由此證明,信確實(shí)是張三發(fā)出的,為什么?因?yàn)槿绻皇菑埲l(fā)的,那寫信的人就沒有張三私鑰,用別的私鑰加密得到的簽名,是無法用張三的公鑰解開的。 李四,再對信的內(nèi)容做hash,得到摘要,與上一步得到的摘要對比,如果一致,則證明信的內(nèi)容沒有被修改過,信的內(nèi)容是完整的。 復(fù)雜的情況出現(xiàn)了。 王五,用自己的公鑰替換李四保存的張三的公鑰,也就是王五欺騙了李四,李四誤把王五的公鑰當(dāng)張三的公鑰,這樣一來,王五就能冒充張三給李四寫信(王五用自己的私鑰加密)。 問題是什么?問題是李四不能確信自己保存的公鑰真的是張三的公鑰。如果客戶端電腦上存的工商銀行官網(wǎng)的公鑰,實(shí)際上是騙子公司的公鑰,那就麻煩大了。 怎么破?讓張三去認(rèn)證中心CA(Certificate Authority),為公鑰做認(rèn)證,怎么做呢?CA中心用自己的私鑰,對張三的公鑰和其他相關(guān)信息一起加密,生成數(shù)字證書(Digital Certificate)。 張三拿到數(shù)字證書后,以后給李四回信,在簽名的同時(shí),附帶上數(shù)字證書。 李四收到信之后,從CA的公鑰解開數(shù)字證書,取出張三的公鑰(一定是真的),然后就能放心的愉快的按之前的流程解開簽名了。 數(shù)字證書加入后,核心區(qū)別就是張三的公鑰不再保存在李四處,而是通過數(shù)字證書下發(fā)。 為什么數(shù)字證書里的張三的公鑰一定是真的呢?因?yàn)镃A是權(quán)威機(jī)構(gòu),假設(shè)全世界就一家(其實(shí)不止,但也不多),它的公鑰天下盡知,就是固定的串,所以能用CA公鑰解開的證書,一定是CA頒布的,因?yàn)镃A用它的私鑰加密產(chǎn)生的證書。很明顯,非對稱加密能用于證明我是我。 密鑰交換算法 著名的DH密鑰交換算法,這個算法很有意思,也很巧妙,簡而言之,就是通信雙方交換一點(diǎn)信息(不怕被偷看到),然后就在兩端,分布產(chǎn)生出一個相同的密鑰,神奇啊。 有一個很有意思的例子。 Alice和Bob要協(xié)商出一個公共的顏色,他們可以交換信息,但交換的信息,可以被偷看到,怎么辦?既能協(xié)商出公共顏色,又不能讓別人知道呢。
密鑰交換算法的原理跟這個差不多,網(wǎng)上有大量的資料講述這個問題,我覺得理解了上面的例子,再看ECDH便也不難了。 眾所周知http是互聯(lián)網(wǎng)協(xié)議,但是它不夠安全,所以后面有改進(jìn)版的https,其實(shí)就是多了一個TLS,這個是傳輸層加密,本質(zhì)上,就是通過handshake,協(xié)商出一個會話密鑰,后面的數(shù)據(jù)傳遞,都用這個密鑰做對稱加解密。 我們經(jīng)常講安全通道,其實(shí)也就是協(xié)商出一個會話密鑰,他并不神秘。胡亂放幾張圖片吧。 為了減少這幾個RTT,又想了各種辦法,然后復(fù)用連接的話,就可以做到0RTT,1RTT了。 就說這些吧,最后拋幾個名詞,有興趣自行百度學(xué)習(xí):DTLS,HMAC,AEAD,重放攻擊,放大攻擊,是不是很高端? |
|