若是想要作到安全地通訊,須要知足如下三點要求:git
對於一個攻擊者來講,他具備的能力包括:算法
所以,利用這些能力,他可以對通訊進行監聽(竊取密碼及信息),冒充通訊方,劫持正在進行的對話,經過佔用大量系統資源使得系統沒法爲合法的用戶提供服務安全
由於加密算法都是標準,公開的,爲了防止攻擊者破解加密的信息,所以須要增長一個額外的祕密信息,即Secret Key。假設被加密的信息爲m,Secret Key爲KA,則被加密的信息爲KA(m):函數爲加密算法,兩個輸入爲m和KA。網絡
一樣,解密者手中一樣有一個Secret Key,即KA,則解密過程爲KB(KA(m)) - > m:函數爲解密算法,兩個輸入爲KB和KA(m)。併發
加密系統分爲Symmetric Key Systems和Public Key Systems。ide
對於Symmetric Key Systems,解密方和加密方使用一樣的Secret Key,即KA = KB。函數
對於Public Key Systems,KA != KB,解密方和加密方分別擁有Private Key(僅一人擁有)和Public Key(任何人都能知道)。既能夠用Private Key進行加密,也能夠用Public Key進行加密,以後使用另外一種Secret Key進行解密便可。加密
如今的對稱加密算法分爲兩類:Stream Ciphers以及Block Ciphers。所謂的Block Ciphers即將數據以K個bits爲單位進行加密,事實上就是將K個bits的全部01排列進行映射。通常K爲64,可是若是將映射表直接存放置內存中是不可行的。所以,通常將64個bits拆分爲8組8個bits,每組bits根據直接進行映射,而後將獲得的結果打亂排序,再重複上述加密步驟。從而在保證加密效果的同時,下降存儲成本。之因此要將每輪加密的結果打亂排序而且重複多輪,目的在於讓原文中的每一個bit都能在最後的加密結果中產生儘可能多的影響。計算機網絡
相同的原文,利用加密算法獲得的密文也將是徹底一致的,這很容易成爲攻擊者進行攻擊的突破口。所以,將原文拆分後的Block爲B1,B2,B3...,引入隨機塊R,利用異或運算的性質,第一個發送的塊爲C1 = KS(B1異或R),第二個發送的塊爲C2 = KS(B2異或C1),第三個發送的塊爲C3 = KS(B3異或C2)...,固然最開始也要發送R,明文便可,由於攻擊者並不知道加密密鑰。最後,接收方能夠經過B1 = KS(C1)異或R,B2 = KS(C2)異或C1...,依次進行解密。該方法稱爲Cipher Block Chaining(CBC)。初始的隨機塊R稱爲Initialization Vector(IV)。經過此種方法,僅僅只需一個隨機數以及一系列的異或運算,就能讓一樣的原文生成不同的密文,增長攻擊難度。排序
對稱加密算法的加密方和解密方公用一個加密祕鑰,可是通常狀況下,如何安全地傳輸加密祕鑰?這其實是一個悖論。Public Key Encryption就是用於解決該問題。事實上,它不只能用於加密數據,在authentication以及digital signatures中也有應用。
當Alice須要和Bob進行通訊時,Bob首先會建立一對Public Key和Private Key,Private Key是Bob私有的,而Public Key能夠爲任何人所知。所以Alice先要獲取Bob的Public Key,用該Key以及公開的加密算法對信息進行加密並傳輸。當Bob收到來自Alice的加密信息以後,利用公開的解密算法以及Private Key對加密信息進行解密,從而安全地獲取到原數據。可是因爲Bob的Public Key是公開的,所以任何人都能將數據加密發送給Bob,Bob也沒法肯定與其通訊的是否真是他想要通訊的人(在對稱加密中,若是對方能用約定的祕鑰進行加密,則默認對方的身份是真實的),此時須要引入數字簽名。
RSA加密的本質是將要傳輸的數據用一個整數進行表示並將該整數進行加密。RSA首先要選擇兩個足夠大的素數p和q,再進行一系列複雜的計算獲得Public Key和Private Key。RSA之因此安全是由於目前沒有方法可以快速地將n分解爲素數p和q,所以它的安全性也並非徹底有保證的。
非對稱加密,例如RSA是很是耗時的,若是每次通訊都用RSA加密,將極大地增長通訊延時。所以,通常都利用RSA來傳遞對稱加密的祕鑰(Session Key),以後進行對稱加密通訊。
所謂的Message Integrity是指,當Bob收到Alice發送的信息時,他須要確保信息的確是Alice發出的而且信息在傳輸過程當中沒有被修改。
哈希函數可以將任意長度的輸入信息轉換爲惟一的,固定長度的輸出,經常使用的哈希函數有MD5和SHA-1。所以,對於要傳輸的信息m,其哈希值爲H(m),則只要傳輸(m, H(m))便可保證m在傳輸過程當中不被修改。可是這並不能保證數據傳輸者的真實性。所以,當Alice和Bob須要通訊時,二者須要共享一個Authentication Key -> s,且傳輸的內容變爲(m, H(m + s)),其中H(m + s)稱爲Message Authentication Key(MAC)。值得注意的是,這一過程無需進行加密。固然,若Bob要肯定與它交互的的確是Alice,它須要事先使用非對稱加密將Authentication Key傳輸給Alice(?)。
Digital Signatures用於表示某個信息的確由某人發出,所以Digital Signatures必須是能夠驗證的且不可僞造的。事實上,利用Public Key Encryption便可作到這一點。由於Private Key僅有生成Key Pair的人才擁有,所以能夠驗證其身份。而爲了節省加密過程的計算量,能夠先用哈希函數將須要加密的文章進行壓縮。所以,若Bob想要向Alice發送信息m,他能夠對m運行哈希函數H(m),再用Private Key對H(m)進行加密,當Alice用Bob的Pulic Key解密得到H(m),與m進行哈希得到對值進行比較,若二者相等,則既能保證信息對完整,又能保證其由Bob發出。
可是若是保證Alice手中對Pulic Key的確就是Bod的呢?此時須要一個權威的機構爲某個Pulic Key背書,這樣的權威機構叫作Certification Authority(CA),它會對某個通訊實體進行驗證併爲其頒發Certificate,Certificate中包含了該通訊實體的Public Key以及Pulic Key Owner的相關信息,而證書的內容也會用CA的Private Key進行加密和簽名。當Bob須要和Alice進行通訊時,Bob會給她發送一個由CA簽名的證書,Alice會用CA的Public Key對Bob的省份進行驗證並從中抽取出Bob的Public Key。
End-Point Authentication是一個通訊實體經過計算機網絡向另外一個通訊實體證實其身份的過程。直觀的想法是經過加密的帳號密碼便可進行身份的驗證,可是這種方法會遭到Playback Attack的攻擊。攻擊者只要重放加密的帳號密碼便可繞過身份驗證。爲了不該攻擊,須要引入Nonce,來保證驗證的即時性。例如Alice想要和Bob進行通訊,Alice發送"I'm Alice"給Bob,Bob選取一個Nonce R(通常應該是時間戳)發送給Alice,Alice用二者都知道的對稱加密算法對R進行加密併發送給Bob,Bob進行解密並校驗R,由此來即便驗證Alice。準確地說,此處二者共知的加密祕鑰是用來驗證Alice身份的,而Nonce是用於保證通信的即時性。
Secure Sockets Layer(SSL)用於爲TCP提供安全保障,可應用於任何運行在TCP之上的應用,但用在基於HTTP協議的應用較多。SSL爲開發者提供了和TCP類似的Socket API,所以用戶能夠簡單透明地對其進行使用。SSL版本3通過簡單修改以後稱爲Transport Layer Security(TLS)。
SSL通常可分爲三個階段:Handshake,Key Derivation以及Data Transfer
由於SSL須要對數據進行加密,而TCP是數據流,所以須要將TCP數據切割爲SSL Record,每一個SSL Record從頭部開始依次包括:Type,Version,Length,Data以及MAC,其中前三個字段不加密,Type字段代表該Record是一個Handshake Message仍是包含應用數據的Message。
真實的SSL Handshake步驟以下:
之因此須要步驟5和6是由於在步驟1和2選擇加密算法的交互信息是未加密的,攻擊者能夠從中剔除強度較高的加密算法,步驟5和6確保通訊雙發接收到的都是未經修改的數據。
事實上每一個SSL Record的MAC包含的DATA(DATA應該包含Type,Version和Length?) + Seq Number + AC的哈希值,Seq Number用於防止SSL Record的Replay,而在Handshake中Client和Server的Nonce則是用於Connection Replay,防止攻擊者利用截取的數據創建重複的鏈接。
當須要關閉SSL時,不能直接發送TCP FIN,而是應該先發送一個Closure SSL Record,雖然Record的Type是明文的,可是有Record的MAC用於驗證。