互聯(lián)網(wǎng)剛開始是安全的,但是伴隨著黑客(Hacker)的誕生,互聯(lián)網(wǎng)變得越來(lái)越不安全模闲。任何一個(gè)事情都有兩面性键兜,黑客也有好有壞,好的黑客叫白帽子,壞的黑客叫黑帽子。與此同時(shí),隨著Web技術(shù)發(fā)展越來(lái)越成熟换薄,而非Web服務(wù)(如Windows操作系統(tǒng))越來(lái)越少的暴露在互聯(lián)網(wǎng)上,現(xiàn)在互聯(lián)網(wǎng)安全主要指的是Web安全翔试。
既然要講Web安全轻要,首先介紹什么是安全,安全的本質(zhì)是什么垦缅?引用《白帽子講安全》里對(duì)安全的定義:安全問(wèn)題的本質(zhì)就是信任問(wèn)題伦腐。舉例來(lái)說(shuō),自行車的車鎖失都,我們認(rèn)為是安全的柏蘑,因?yàn)槲覀冋J(rèn)為自行車鎖的制造商是不會(huì)背著我們留有鑰匙幸冻,如果這個(gè)信任都沒(méi)有的話,那么這個(gè)自行車就是不安全的咳焚。
在介紹完什么是安全的本質(zhì)后洽损,我們繼續(xù)講解安全的三要素,機(jī)密性革半、完整性和可用性碑定。機(jī)密性指的是要求保護(hù)數(shù)據(jù)內(nèi)容不能泄露,加密是實(shí)現(xiàn)機(jī)密性要求的常見(jiàn)方法又官。完整性指的是保護(hù)數(shù)據(jù)內(nèi)容是完整的延刘、沒(méi)有被篡改的,實(shí)現(xiàn)完整性的常見(jiàn)方法是數(shù)字簽名六敬〉饫担可用性要求保護(hù)資源是隨需而得,黑帽子通常通過(guò)DDos攻擊搶占服務(wù)器的資源外构,導(dǎo)致正常用戶不能正常訪問(wèn)普泡。接下來(lái)介紹常見(jiàn)的加密算法和數(shù)字簽名算法。
加密算法
常見(jiàn)加密算法有對(duì)稱加密和非對(duì)稱加密审编,對(duì)稱加密指的是加密和解密用的同一個(gè)密鑰撼班,而非對(duì)稱加密的加密過(guò)程和解密過(guò)程用的是不同密鑰,常見(jiàn)對(duì)稱加密有DES(Data Encryption Standard垒酬,數(shù)據(jù)加密標(biāo)準(zhǔn))和AES砰嘁,而非對(duì)稱加密有RSA。
- 對(duì)稱加密算法
對(duì)稱加密算法我們主要介紹AES(Advanced Encryption Standard勘究,高級(jí)加密標(biāo)準(zhǔn))般码,AES三個(gè)基本概念:密鑰、填充乱顾、模式。根據(jù)密鑰長(zhǎng)度宫静,AES又可以細(xì)分為AES128走净、AES192、AES256孤里。下面介紹AES的加密流程伏伯,首先將明文分解為大小為128bit小塊,然后將這些明文小塊放入AES加密器各自生成密文塊捌袜。當(dāng)將明文小塊大小小于128bit時(shí)说搅,需要對(duì)這個(gè)明文小塊進(jìn)行填充操作。而AES加密器提供了CBC虏等、ECB适肠、CTR等5種模式。
- 非對(duì)稱加密算法
非對(duì)稱加密算法我們主要介紹RSA算法候引,RSA算法基于大數(shù)分解難而使得該算法異常安全侯养。下面我們開始描述RSA算法澄干,首先選擇兩個(gè)充分大的質(zhì)數(shù)p和q辩稽,并計(jì)算 n=pq逞泄。接下來(lái)計(jì)算m=(p-1)(q-1)炭懊,最后找出兩個(gè)數(shù)e和d,使得 (e*d) mod m =1稻励。其中e和n就是公鑰,而d和n就是私鑰。任何知道公鑰的人都可以利用公式 c = a^e mod n把原始數(shù)據(jù)加密成一個(gè)密文斟览,私鑰的持有者可以通過(guò)公式 c^d mod n 計(jì)算原始數(shù)據(jù)a。通過(guò)計(jì)算公式我們也可以發(fā)現(xiàn)加密和解密的算法是不一樣的,這也是”非對(duì)稱“的由來(lái)鸠窗。
- 融合對(duì)稱加密算法和非對(duì)稱加密算法
通過(guò)對(duì)對(duì)稱加密算法和非對(duì)稱加密算法的介紹稍计,我們知道如果A、B兩個(gè)人想要建立會(huì)話净刮,為了保證會(huì)話的機(jī)密性剥哑,我們需要對(duì)數(shù)據(jù)進(jìn)行加密星持,這個(gè)密碼本只有A督暂、B兩個(gè)人知道逻翁,而如何保證這個(gè)密碼本在傳輸?shù)倪^(guò)程中不被第三者竊取呢八回?我們可以通過(guò)非對(duì)稱加密對(duì)密碼本進(jìn)行加密驾诈,即A首先呼叫B乍迄,并索要B的公鑰漾狼,然后用B的公鑰對(duì)密碼本進(jìn)行加密并將密文發(fā)送給B逊躁,B收到A的消息之后核芽,用自己的私鑰進(jìn)行解密绿店。這個(gè)過(guò)程看起來(lái)已經(jīng)很完美了假勿,但是有一個(gè)讓人意想不到的漏洞--中間人攻擊恶导。中間人在網(wǎng)絡(luò)中發(fā)現(xiàn)A索要B的公鑰這條消息诚亚,當(dāng)B將自己的公鑰發(fā)送給A時(shí)闸准,中間人截取B的公鑰瘾英,并將自己的公鑰發(fā)送給A。接下來(lái)颂暇,A將自己的密碼本通過(guò)中間人的公鑰繼續(xù)加密發(fā)送給B缺谴,中間人截取A發(fā)出來(lái)的這條消息,用自己的私鑰進(jìn)行解密耳鸯,然后用B的公鑰進(jìn)行加密湿蛔,重新發(fā)送給B。B收到消息后并不會(huì)發(fā)現(xiàn)什么異常县爬,因?yàn)锽能用自己的私鑰進(jìn)行解密阳啥。但是它們都不知道中間人已經(jīng)完全掌握了它們的密碼本。
中間人攻擊是在獲取對(duì)方公鑰的時(shí)進(jìn)行替換财喳,那么察迟,解決這個(gè)問(wèn)題的辦法就是建立一個(gè)獲取對(duì)方公鑰的可信渠道斩狱。一個(gè)簡(jiǎn)單而有效地辦法就是建立一個(gè)所有人都信任的權(quán)威機(jī)構(gòu),有改權(quán)威機(jī)構(gòu)來(lái)存儲(chǔ)并分發(fā)大家的公鑰扎瓶。這就是我們通常所說(shuō)的數(shù)字認(rèn)證機(jī)構(gòu)所踊,英文是Certificate Authority,簡(jiǎn)稱CA概荷。任何人都可以申請(qǐng)把自己的公鑰放到CA上去秕岛,不過(guò)CA必須親自檢驗(yàn)申請(qǐng)者是不是符合資格。如果A想要和B建立會(huì)話误证,那么A直接從CA出獲取B的公鑰继薛,這樣A就不用擔(dān)心拿到的公鑰是不是假的。
簽名算法
中間人既然能假扮公鑰雷厂,會(huì)不會(huì)假扮CA呢惋增?答案是肯定的。這樣一來(lái)改鲫,CA不但需要向A保證“這個(gè)公鑰確實(shí)是B的”诈皿,還要向A證明”我確實(shí)是CA“。對(duì)應(yīng)的解決方法是數(shù)字簽名算法像棘。CA首先生存一個(gè)自己的公鑰私鑰對(duì)稽亏,然后將公鑰公之于眾。之后缕题,CA對(duì)每條發(fā)出去的消息都用自己的私鑰加個(gè)密作為簽名截歉,以此證明消息的來(lái)源是真實(shí)的。接受方收到消息之后烟零,用CA的公鑰進(jìn)行解密瘪松,如果能解得開,則說(shuō)明對(duì)方一定是真實(shí)的CA锨阿。因?yàn)橄溃@樣的消息只有私鑰持有者才能做的出來(lái)。至此為止墅诡,加密算法和簽名算法就講解完畢壳嚎,一條安全的通信線路的設(shè)計(jì)也有了一個(gè)比較完美的方案。