安全領(lǐng)域有兩個(gè)非常重要的術(shù)語:機(jī)密性和加密,其中機(jī)密性一般描述我們的業(yè)務(wù)目標(biāo),比如用戶賬戶管理系統(tǒng)中,密碼必須具備機(jī)密性,而加密是實(shí)現(xiàn)機(jī)密性的一種手段。在安全加密剛剛起步的時(shí)候,研究加密算法占據(jù)了科研人員大部分的時(shí)間,科研人員經(jīng)常問自己的問題是:如何讓通信雙方更加安全?這句話翻譯成大白話的意思就是,我們通過什么手段能夠讓通信雙方交換的數(shù)據(jù)(字節(jié)碼)和信息(明文信息)不被第三者獲取。
安全的研究剛開始屬于典型的軍用領(lǐng)域,隨著時(shí)代的發(fā)展,這些研究成果逐漸公開,被廣泛應(yīng)用于政府和民用領(lǐng)域,我們現(xiàn)在享受的一切和互聯(lián)網(wǎng),數(shù)字化相關(guān)的便利,有很大一部分功勞應(yīng)該歸于安全領(lǐng)域在過去幾十年的發(fā)展和沉淀。舉個(gè)不恰大的例子,如果你使用在線的支付平臺(tái)導(dǎo)致賬戶被竊取損失了銀子,你還會(huì)用在線支付系統(tǒng)嗎?答案當(dāng)然是否定的,除非你不在乎錢。說到加密,很多人用不同的理解,其實(shí)科研的本質(zhì)是要解決實(shí)際生活終于到的問題。用大白話說加密(cipher)就是:外交部發(fā)言人如何應(yīng)付corrupted news network記者刁鉆的惡意問題,特別是哪些長期不生活在中國大陸的記者們,關(guān)鍵事件節(jié)點(diǎn)過來刷臉,可能一時(shí)半會(huì)聽不懂,回去要查表才能解密出明文,亦或者查表之后,還是無法理解(理解歪曲,然后寫一堆blabla..惡意攻擊中國的fact check文章來糊弄naive的外國友人)。外交部發(fā)言人講話的過程中,對(duì)數(shù)據(jù)進(jìn)行了加密處理。
當(dāng)然要把這個(gè)事情更加形象的說清楚,還是要請(qǐng)出我們的老朋友愛麗斯女王和鮑勃領(lǐng)主,這次他們要傳誰會(huì)被選為下一屆”王國日?qǐng)?bào)“的總編輯。由于科技發(fā)展的很快,愛麗斯女王可以通過郵件,電子郵件,電話以及局域網(wǎng)(邏輯性有點(diǎn)問題,大家就當(dāng)娛樂版看吧,這個(gè)時(shí)代還沒有互聯(lián)網(wǎng))來進(jìn)行信息交互,并且王國內(nèi)的人民還都比較單純,屬于路不拾遺,夜不閉戶類型的,因此這些線路上并沒有什么太強(qiáng)的安全手段,大白話說就是這幾個(gè)通信方式都不安全。
任務(wù)事物都具備兩面性,科技的發(fā)展也不例外,除了帶動(dòng)文明的發(fā)展之外,人們也變得復(fù)雜了。具體來說,在王國內(nèi),逐漸出現(xiàn)快遞員會(huì)打開”重要的“信件(比如來自于郡主啊,城堡主啊,王室成員啊)來一探究竟,電話系統(tǒng)的接線員對(duì)來自特定號(hào)碼的電話通信會(huì)偷聽,而哪些局域網(wǎng)的節(jié)點(diǎn)提供者也會(huì)對(duì)流經(jīng)服務(wù)器的數(shù)據(jù),特別是進(jìn)入操作系統(tǒng)的PREROUTING階段(Linux操作系統(tǒng),對(duì)網(wǎng)絡(luò)的處理核心netfiler不是很了解的同學(xué),可以關(guān)注筆者后續(xù)關(guān)于虛擬化網(wǎng)絡(luò)的相關(guān)文章),旁路了數(shù)據(jù)包,用稍微時(shí)髦一點(diǎn)的話說,這叫man-in-the-middle攻擊。
由于這人變復(fù)雜了,愛麗斯女王和鮑勃領(lǐng)主突然覺得這種信息幾乎裸奔的形式非常的不安全了,因此迫切需要解決方案。作為云原生和云計(jì)算領(lǐng)域的知名架構(gòu)師,我們需要服務(wù)好愛麗斯女王,給出合理(在預(yù)算,風(fēng)險(xiǎn)和可行性,可擴(kuò)展性,性能,可運(yùn)維性,靈活性之間找到最優(yōu)解,這么看起來架構(gòu)師的職位很快也會(huì)被深度學(xué)習(xí)給解決掉,如果你想保住飯碗,深度學(xué)習(xí)是上游,趕緊在十一認(rèn)真學(xué)習(xí)起來吧。)的解決方案。由于讀者看了云攀老師持續(xù)更新的安全系列文章,遇到這個(gè)場(chǎng)景根本不會(huì)覺得陌生:這不就是加密的場(chǎng)景嗎?,沒錯(cuò),我們通過引入加密算法(encryption algorithm或者cipher)來保證女王和領(lǐng)主之間的數(shù)據(jù)不會(huì)被非法竊取。
咱們先來腦補(bǔ)一下這個(gè)場(chǎng)景:女王和領(lǐng)主各自有一個(gè)神奇的寶箱,愛麗斯女王把要發(fā)給領(lǐng)主的八卦消息通過自己的寶箱進(jìn)行加密,生成密文(一串看不出所以然的隨機(jī)字符串),加密的過程具體來說需要兩個(gè)輸入:
1,秘鑰,用來對(duì)數(shù)據(jù)進(jìn)行加密。秘鑰必須不可預(yù)測(cè),隨機(jī),已經(jīng)被安全的保護(hù),因?yàn)檎麄€(gè)安全體系的強(qiáng)度和這個(gè)秘鑰是否能夠安全的受到保護(hù)息息相關(guān)。
2,八卦信息,這個(gè)是廢話(為了保證內(nèi)容的連貫和完整)。比如咱上邊說的王國日?qǐng)?bào)的總編輯候選人屬于信息,視頻,圖片等也屬于信息(開個(gè)玩笑,這里的信息其實(shí)也有約束,任何可以被轉(zhuǎn)換成二進(jìn)制的事物都可以稱作信息,數(shù)據(jù)。不要試圖對(duì)一只貓進(jìn)行加密!除非你能把一只活體的貓變成bit,但是這又進(jìn)入人工智能領(lǐng)域了,對(duì)于生物來說,生命之源組成軀體可能只是一堆線路和零件而已。)。
愛麗斯女王將上邊的兩個(gè)信息輸入到自己寶箱,然后就產(chǎn)出了密文(ciphertext,這個(gè)單詞很形象,text被cipher后,就變成了ciphertext),大白話說就是經(jīng)過加密后產(chǎn)生的密文。由于信息被進(jìn)行了加密,因?yàn)閻埯愃古蹩梢噪S意選擇合適的通信方式(mailman,email,電話和局域網(wǎng))來將加密后的密文信息發(fā)給領(lǐng)主鮑勃。假設(shè)女王選擇了郵遞的方式,任憑有多少郵差打開敞口的信件,始終無法讀懂女王寫的哪些奇奇怪怪的0和1。
當(dāng)領(lǐng)主鮑勃收到郵遞員送來的信件后,把信件上的密文,用自己的寶箱上的解密算法(decryption algorithm)進(jìn)行解密,獲取愛麗斯女王發(fā)送給自己的她聽到的下一任主編的人選,哈哈大笑的同時(shí),使勁的拍大腿,并自言自語到,女王和老臣想到一塊去了,想到一塊去了。領(lǐng)主夫人翻著白眼說,高興歸高興,能不能拍自己的大腿?具體來說,解密也需要兩個(gè)輸入信息:
1,秘鑰,這個(gè)秘鑰必須和愛麗斯女王用來加密的秘鑰一致。閱讀過筆者前邊關(guān)于對(duì)稱加密文章的同學(xué),應(yīng)該隨口就能出:這不就是對(duì)稱加密嗎?沒錯(cuò),并且女王和領(lǐng)主使用的這相同的key,我們也叫對(duì)稱秘鑰。
2,密文,郵遞員送來信件上的那串奇怪的0和1
解密的過程本質(zhì)上是加密的逆向操作,用來把密文還原成原始的信息,我們通過下圖來總結(jié)一下整個(gè)過程涉及到的四個(gè)步驟。

注:雖然筆者在上圖中開玩笑式的說女王和領(lǐng)主在一次線下團(tuán)建確定了秘鑰,但是在實(shí)際場(chǎng)景中,特別是現(xiàn)在疫情如此反復(fù)不定的情況下,線下交換秘鑰無論從安全性和效率都不可取,特別是引入定期key輪換來提升安全強(qiáng)度的項(xiàng)目上,很快就會(huì)成為問題。在實(shí)際項(xiàng)目中,我們需要使用安全的機(jī)制來生產(chǎn),交換,更新,傳輸秘鑰信息,有時(shí)候也叫秘鑰管理。阿里云提供了KMS服務(wù),專門針對(duì)這種場(chǎng)景,感興趣的和不感興趣的都可以了解一下。
看到這里,大家可能會(huì)有點(diǎn)疑惑,標(biāo)題不是說的是認(rèn)證加密,為啥只看到加密,沒有看到認(rèn)證呢?標(biāo)題黨??!大家稍安勿躁,從安全的最佳實(shí)踐和規(guī)范的角度來看,光靠加密是無法保證安全性,或者機(jī)密性的,因此我們需要先介紹加密,然后在介紹認(rèn)證加密,邏輯上也合理。
讀完上上邊看似小說的內(nèi)容后,在要進(jìn)入稍微硬核的內(nèi)容了(安全領(lǐng)域和數(shù)學(xué)緊密相關(guān),筆者只能盡自己最大的能力將內(nèi)容寫的親和)。首先我們從加密算法開始,從業(yè)界標(biāo)準(zhǔn)AES(Advanced Encrytion Standard)這個(gè)算法開始。
美國國家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)在1997年舉辦了一個(gè)有關(guān)AES(高級(jí)加密標(biāo)準(zhǔn),中文翻譯聽起來很沒有代入感,后邊筆者會(huì)直接用AES)的安全競(jìng)賽,來繼承已經(jīng)日落西山的DES算法的衣缽。這個(gè)安全競(jìng)賽持續(xù)了三年時(shí)間,從15個(gè)不同的參賽團(tuán)隊(duì)提交的算法中,組委會(huì)確定了Rijndael算法,由Vincent Rijmen和Joan Daemen設(shè)計(jì)并提交。2001年,NIST公布了AES的最終標(biāo)準(zhǔn),即便是在20年后的今天,AES仍然是主要的加密算法,活躍在我們?nèi)粘I畹闹車?/p>
坦白說,AES的內(nèi)部工作機(jī)制不是筆者能駕馭的,能講清楚的,但是由于任何事物都可以有不同的抽象層次,對(duì)于技術(shù)來說也是如此,筆者堅(jiān)信Don Box那句its all about perspective的名言,因此我們來稍微探索一下AES的內(nèi)容工作原理,為理解認(rèn)證加密打下基礎(chǔ)。
AES算法也提供了多個(gè)版本,其中包括:AES-128(秘鑰的長度是126bit,也就是16bytes),AES-192(秘鑰長度24bytes),以及AES-256(秘鑰長度32bytes)。不同秘鑰長度不出所料的意味著不同的加密安全強(qiáng)度,簡(jiǎn)單粗暴的說法就是:秘鑰越長,越安全。結(jié)合筆者在前邊文章介紹的內(nèi)容,一般我們需要最少保證128bit的安全,因此AES-128是最為常用的版本。
日常的項(xiàng)目中我們經(jīng)常會(huì)聽到bit安全(bit security),這個(gè)術(shù)語通常用來描述加密算法的安全強(qiáng)度。舉個(gè)例子,AES-128可以提供128bit的安全強(qiáng)度,也就是惡意攻擊者需要嘗試2^128次方次,才有機(jī)會(huì)將密文還原成明文。
注:在安全領(lǐng)域,bit security中的數(shù)字,比如128bit,說的是上限,因?yàn)榇嬖赽irthday bound,彩虹表,攻擊統(tǒng)計(jì)分析等手段,因此惡意攻擊者一般可能不需要進(jìn)行2^128次方就能得手,這是最壞情況。那么聰明的你肯定會(huì)問,有沒有上限?這就取決于安全體系了,比如說流程安全。筆者最近遇到的一個(gè)真實(shí)的場(chǎng)景是,將數(shù)據(jù)庫連接信息通過AES-128算法加密放到配置文件中,項(xiàng)目組覺得很安全,提供了幾乎不可能被竊取的安全保障。但是你有沒有想過,解密這個(gè)數(shù)據(jù)庫字符串的秘鑰放哪里呢?對(duì)不起項(xiàng)目組直接寫代碼里了。安不安全大家考慮一下,這就類似于門上掛著20w售價(jià)的5斤大鎖,而鑰匙就掛載把手上。
2的128次方具體有多大,找個(gè)計(jì)算機(jī)算一下(還需要好一點(diǎn)的,一般計(jì)算器很快就約等于了),結(jié)果是340282366920938463463374607431768211456,這個(gè)數(shù)字具體怎么念,筆者也不是很清楚。但是由于筆者是計(jì)算機(jī)專業(yè)人士,我知道的是2的128次方是2的127次方的兩倍,按照這邏輯,我們看看稍微小點(diǎn)的2的100次方,大概是1268萬億億次,這個(gè)數(shù)字具體如何類比,但是網(wǎng)上有個(gè)初中的奧數(shù)題,一起來感受一下這個(gè)神奇的數(shù)字。
題目為假設(shè)有一張可以充分折疊,厚度為0.1毫米的紙(讀者可以想象為辦公室隨處可見的A4紙),在不計(jì)除了紙張之外任何厚度的情況下(比如對(duì)著后,我們假設(shè)對(duì)這面可以充分的貼合,沒有空隙),那么將其對(duì)折N次后,對(duì)折后的厚度為h=2^N*0.1mm。咱就這么對(duì)折,有幾個(gè)數(shù)據(jù)非常的有意思:1,對(duì)折10次之后,就是1分米,小學(xué)生用的尺子的長度;2,對(duì)折25次后,大概是3355米,已經(jīng)把五岳壓腳下了;3,對(duì)折35次后,厚度大約是3436,已經(jīng)快離開大氣層了;4,對(duì)折50次,厚度達(dá)到了1.1億千米,來回火星一次;5,激動(dòng)人心的時(shí)刻到了,對(duì)折100次以后,就是12676500000000000000000千米,換個(gè)單位就是134億光年,宇宙大爆炸到現(xiàn)在的全部時(shí)間也就是137億年,使得光從這張折疊紙的頂端到到我們的眼睛中。
上邊的這些討論主要想給大家一個(gè)直觀的關(guān)于128bit加密強(qiáng)度的類比,可以看到這個(gè)數(shù)字非常大,但是筆者還是要強(qiáng)調(diào),安全是個(gè)體系的概念,光靠加密128bit,就算是512bit,秘鑰隨便寫在安全人員的筆記本上,胡亂扔在桌子上的話,和采用8bit沒有啥太大的區(qū)別(8bit只需要最多32次嘗試,就可能破解密文)。
從抽象的角度看,AES-128算法可以有如下描述:
1,AES算法接收一個(gè)變長的秘鑰
2,輸入的待加密文本為128bit
3,加密后輸出的密文也為128bit長
從上邊的描述可以看出,AES算法加密的明文信息為定長,我們也稱這種加密算法為block cipher。在加密算法領(lǐng)域,的確存在接受變長輸入數(shù)據(jù)的算法,筆者會(huì)在后續(xù)的文章中詳細(xì)介紹。
在解密階段,AES通過相同的秘鑰,把密文(128bit)的信息還原成明文。AES能夠?qū)崿F(xiàn)加密和解密,特別是解密的特性的一個(gè)很重要的原理是:AES具備數(shù)學(xué)上的確定性特征(deterministic),通過對(duì)信息進(jìn)行加密后,一定能夠解密出來原文。因?yàn)楣饪醇用埽B我們自己都可以設(shè)計(jì)一套機(jī)密性很高的加密算法,但是要保證機(jī)密性的同時(shí)還需要保證可解密,這就需要高深的數(shù)學(xué)知識(shí)了。
從數(shù)學(xué)的角度來看,AES這樣的block cipher加密算法(使用秘鑰),也稱作數(shù)組變換,或者排列組合計(jì)算。數(shù)組變化具體來說,就是將所有的輸入數(shù)據(jù)”變換“成密文(ciphertext),而key(秘鑰)的核心作用是定會(huì)有了mapping(變換)的規(guī)則。這就意味著當(dāng)我們更換了秘鑰,整個(gè)變化規(guī)則發(fā)生了變化,因此加密的后的密文也會(huì)發(fā)生變化。從密文的角度,通過這個(gè)key(定義了mapping關(guān)系),來將密文映射回原始的明文數(shù)據(jù)。如下圖所示的AES加密過程示意圖:

如上圖所示,AES-128加密過程本質(zhì)上就是數(shù)組變換,從左邊的輸入(數(shù)組集合)變換到右邊的數(shù)組集合。當(dāng)然我們不會(huì)把所有的從左邊到右邊的變換都列出來,因?yàn)橛?的128次方種可能。因此設(shè)計(jì)了AES算發(fā),本質(zhì)上AES的工作原理就是上邊的組合變換,通過一個(gè)隨機(jī)的key來定義變換的mapping關(guān)系。AES提供的這種特性也叫偽隨機(jī)置換(pseudorandom permutations)。
到現(xiàn)在為止我們描述還是宏觀層面的AES工作原理,接下來我們深入一層,從AES的內(nèi)部視角,看看加密和解密的過程是如何具體執(zhí)行的。首先,AES在計(jì)算之前,會(huì)將128bit的輸入,也就是16字節(jié)的數(shù)據(jù)變成4乘4的字節(jié)矩陣,如下圖所示:

如上圖所示,數(shù)據(jù)會(huì)被轉(zhuǎn)換成這樣的一個(gè)4*4的矩陣。接著AES算法計(jì)算密文會(huì)迭代多次,最終計(jì)算出最后的密文,如下圖所示:

上圖沒有畫出秘鑰,主要是為了清晰起見,讀者需要注意這個(gè)細(xì)節(jié)的缺失。每個(gè)round function使用的round key是不同的,那么這個(gè)key從哪里來呢?AES算法中,會(huì)通過一種叫key scheduler的機(jī)制來從秘鑰派生出round key。這種機(jī)制下,我們傳統(tǒng)上稱AES為對(duì)稱加密就不太準(zhǔn)確了,因?yàn)閷?shí)際上加密的秘鑰是一種隨機(jī)生成的round key。
讓我們把目光聚焦到這個(gè)神奇的灰色box上,你肯定很想知道這個(gè)box內(nèi)部的工作原理,我們接下來就來說說。round function的核心職責(zé)就是將輸入的bytes進(jìn)行狀態(tài)變換(mix,transform),并且AES中,round function主要有四個(gè)子功能:SubBytes,ShiftRows,MixColunmns,以及AddRoundKey。對(duì)于這幾個(gè)方法的詳細(xì)介紹我們就不展開了,主要是也說的不專業(yè),不過任何一本關(guān)于AES的書籍中,都會(huì)有這四個(gè)方法的詳細(xì)介紹。
從解密的角度看,這四個(gè)方法的前三個(gè)很容易進(jìn)行逆向操作,而最后一個(gè)需要一個(gè)round key才能逆向操作,如下圖所示:

如上圖所示,AES提供的四個(gè)子函數(shù)會(huì)被用在整個(gè)加密的流程中,并且每個(gè)方法都可可逆,要不然解密無從談起啊。大家注意最后一步的符號(hào),這里需要進(jìn)行異或操作。
Round函數(shù)具備應(yīng)該被執(zhí)行多少次取決于我們對(duì)安全強(qiáng)度的訴求,來防止信息泄露。舉個(gè)例子,如果我們的round函數(shù)調(diào)用的次數(shù)為3的話,那么AES-128版本很容易就會(huì)遭受total breaks攻擊(通過大量的計(jì)算來破解秘鑰)。通過多次的迭代調(diào)用round function,輸入的明文會(huì)被轉(zhuǎn)換成和完全不想關(guān)的密文。并且如果明文哪怕是發(fā)生一個(gè)bit的變化,密文的輸出也會(huì)完全不一樣,來防止統(tǒng)計(jì)攻擊等風(fēng)險(xiǎn)。
注:在真實(shí)的項(xiàng)目上,我們選擇合適的加密算法一般從安全強(qiáng)度,加密長度,性能等的角度來評(píng)估,安全強(qiáng)度和長度強(qiáng)先關(guān),我們就不細(xì)說了。而性能和硬件有關(guān),比如主流的CPU廠商Intel和AMD提供了AES-NI指令,來在硬件級(jí)別提供對(duì)AES加解密的支持。
關(guān)于AES的工作原理,其實(shí)還有一個(gè)現(xiàn)實(shí)的問題沒有討論:如果輸入數(shù)據(jù)的長度不足128bit,該如何處理?這是一個(gè)很現(xiàn)實(shí)問題的原因是大部分待加密的數(shù)據(jù)都不可能正好是128bit的整數(shù)倍,因此我們需要某種機(jī)制來解決當(dāng)長度不夠的時(shí)候,如何處理。你肯定會(huì)脫口而出:padding,這個(gè)筆者在哈希算法的時(shí)候詳細(xì)的解釋過。
不過AES提供了兩種模式,一種是padding,另外一種叫AES操作模式(mode of operation)的機(jī)制。我們來舉個(gè)實(shí)際的例子,假設(shè)我們有一些信息需要加密,我們可以按16bytes長度對(duì)原始的數(shù)據(jù)進(jìn)行切分,但是最后剩下的部分不夠16bytes,我們可以給最后一部分補(bǔ)充一些數(shù)據(jù),來讓它正好16bytes長。
雖然說這個(gè)原理很好理解,很快你就會(huì)發(fā)現(xiàn),選擇什么數(shù)據(jù)會(huì)很重要,因?yàn)槲覀冊(cè)诮饷艿臅r(shí)候,還需要可逆。有些同學(xué)可能直接會(huì)想到,補(bǔ)0不就行了。其實(shí)補(bǔ)0是有問題的,因?yàn)樵诮?jīng)過AES的加密處理后,首先這些補(bǔ)充的0可能不是0了,另外我們也不知道具體的邊界在哪里,無法解密。
針對(duì)這個(gè)問題,RSA公司在1990年就提出了一種稱作是PKCS#7的padding機(jī)制。PKCS#7機(jī)制的原理很簡(jiǎn)單:用具體需要padding長度來填充不足16bytes部分。如果字符串剛好能夠基于16bytes等分,那么就在的字符串后邊增加一個(gè)額外的16bytes數(shù)據(jù)塊,這樣在解密的時(shí)候,只需要對(duì)最后一個(gè)字節(jié),然后把這個(gè)字節(jié)對(duì)應(yīng)長度的數(shù)據(jù)抹掉就是原來的數(shù)據(jù)長度。
不得不說這個(gè)算法太精妙了,大家可以體會(huì)一下,特別是我們需要通過分隔符的場(chǎng)景,可以考慮這種方案,特別是分隔符可能出現(xiàn)在原始數(shù)據(jù)中的場(chǎng)景。如下圖所示:

如上圖所示,我們通過PKCS#7機(jī)制提供的padding功能,解決了長度不夠16bytes的問題。不過在高興之前,我們來聊聊AES這種加密機(jī)制的一個(gè)缺陷。AES-128算法這種將輸入數(shù)據(jù)切分為16bytes長度來進(jìn)行加密計(jì)算的方式也稱作:ECB(electronic codebook)操作模式。由于AES算法的加密必須滿足數(shù)學(xué)的確定性,因此我們?nèi)绻麑?duì)相同的輸入數(shù)據(jù)加密兩次來此,得到的結(jié)果完全一致。這在安全上是好事,反過來看也是壞事:加密后的密文呈現(xiàn)出固定的可重復(fù)模式。
從加密原理的角度,這看起來不算太大的問題,但是加密結(jié)果有固定的模式是一個(gè)安全風(fēng)險(xiǎn)。因?yàn)楣潭J交蚨嗷蛏贂?huì)泄漏原始數(shù)據(jù)的某些特征。關(guān)于這個(gè)問題業(yè)界最著名的案例就是ECB penguin,如下圖所示:

從上圖中我們看到了啥?對(duì)原始的企鵝圖片進(jìn)行加密后,我們還是很容易認(rèn)識(shí)到,這就是一個(gè)企鵝圖片,這顯然是有問題的。為了解決這個(gè)問題,AES提供了一種叫CBC(cipher block chaining)的模式,在原始的block cipher之上,增加了一個(gè)叫IV(initialization vector)初始化變量的參數(shù),來提供更強(qiáng)的隨機(jī)性,消除模式。
大家應(yīng)該不難想到,IV的長度在AES-128版本上也是16bytes長,并且很明顯這也是秘鑰,因此也必須提供足夠的隨機(jī)性和不可預(yù)測(cè)性。具體的變化叫就是128bit(16bytes)的數(shù)據(jù)在進(jìn)行加密之前,會(huì)先和IV進(jìn)行異或操作,而這個(gè)IV必須在加密之前隨機(jī)產(chǎn)生。這種方式有效的解決了相同的輸入數(shù)據(jù)模式的問題,因?yàn)槊恳粔K數(shù)據(jù)在和IV進(jìn)行異或操作之后,會(huì)完全不一樣,消除了模式。
第一塊數(shù)據(jù)處理完之后,如果有超過126bit的后續(xù)數(shù)據(jù)需要加密,那么前一個(gè)128bit產(chǎn)生的密文,會(huì)和第二塊128bit的數(shù)據(jù)先進(jìn)行異或操作,然后再進(jìn)行round founction加密操作,這樣初始輸入的IV就可以繼續(xù)為第二個(gè)數(shù)據(jù)塊的加密注入隨機(jī)性,以此類推。筆者需要再次強(qiáng)調(diào)的是,IV必須和秘鑰一樣,隨機(jī),不可預(yù)測(cè)。下圖是CBC加密模式的流程:

加密的過程理解清楚后,我們來看看具體解密的過程。由于在加密的時(shí)候使用了這個(gè)IV(可以看成另外一個(gè)秘鑰),那么解密的時(shí)候,也需要這個(gè)IV,具體的解密過程從原理上就是加密的逆向操作,由于IV的隨機(jī)性,因此信息傳遞的過程中會(huì)具備很強(qiáng)的安全性,如下圖所示:

在加密的過程中引入某個(gè)隨機(jī)變量來提升強(qiáng)度是一張非常通用的做法。原理很簡(jiǎn)單,但是在實(shí)際的項(xiàng)目中,IV的選擇是造成安全隱患的主要原因。IV必須足夠的安全,主要體現(xiàn)在唯一性,隨機(jī)性和不可預(yù)知性上。因此很多加密實(shí)現(xiàn)框架上,直接在后臺(tái)把IV給去掉了,框架自己生成,而不是讓用戶輸入(這又再次證明,人才是整個(gè)系統(tǒng)最不安全的因素)。
注:當(dāng)IV的選擇出現(xiàn)安全風(fēng)險(xiǎn),比如說IV容易被預(yù)測(cè)(用電話號(hào)碼,名字的品應(yīng),郵箱地址等),那么黑客就可以利用著名的BEAST攻擊,通過瀏覽器的漏洞來攻擊TLS協(xié)議。
好了,關(guān)于認(rèn)證加密的第一部分就這么多了,雖然說我們尚未涉足認(rèn)證加密,但是希望大家通過這篇文章能對(duì)AES, AES CBC模式有更加全面的理解,為理解(下)的內(nèi)容打好基礎(chǔ)。在結(jié)束本章的內(nèi)容之前,不知道大家是否發(fā)現(xiàn)一個(gè)問題,即便是通過AES-CBC這種模式,仍然存在安全風(fēng)險(xiǎn)?具體是什么,我們下篇文章來解答,敬請(qǐng)期待!