這篇文章主要講述在Mobile BI(移動商務(wù)智能)開發(fā)過程中,在網(wǎng)絡(luò)通信、數(shù)據(jù)存儲、登錄驗證這幾個方面涉及的加密算法。
文章的具體內(nèi)容包括:序言,對稱密鑰加密(分組密碼、DES、3DES、AES),非對稱密鑰加密(RSA、ECC、數(shù)字簽名),消息摘要算法(MD5、SHA、MAC、HMAC),編碼(Base64),破解(暴力破解法、字典攻擊、彩虹表、旁道攻擊、中間人攻擊、長度擴展攻擊、重放攻擊、碰撞攻擊、代數(shù)攻擊),引用。
序言
BI應(yīng)用的主要對象是對數(shù)據(jù)安全非常敏感的企業(yè),這就要求我們在Mobile BI的開發(fā)過程中要特別注意對數(shù)據(jù)的存儲、通信、驗證等進行保護,而加密算法可以防止數(shù)據(jù)的讀取、確保數(shù)據(jù)的完整性以及實現(xiàn)身份認證,這篇文章對應(yīng)用普遍的加密算法進行簡單的介紹,以便在后繼Mobile BI安全功能的講解中可以對安全功能實現(xiàn)的理論基礎(chǔ)有一個清晰的認知。
加密算法可以簡單的分為“對稱密鑰加密算法”和“非對稱密鑰加密算法”,這是以加解密過程中使用的密鑰是否相同來區(qū)分的:
- “對稱加密算法”是指加密和解密使用同一個密鑰,一般而言,算法的強度與密鑰的長度成正比,涉及的加密算法包括:AES、DES、Triple DES、RC2、RC4、IDEA、Camellia等。
- “非對稱密鑰加密算法”是指加密和解密使用不同的密鑰,通常包括兩個密鑰,一個公鑰,可以對外公開,一個私鑰,只有自己知道,這種算法現(xiàn)在的主要應(yīng)用是在開放且不安全的網(wǎng)絡(luò)上認證身份。這里涉及的加密算法包括:RSA、DSA、Diffie-Hellman等。
此外,如果不需要保證消息可以被完整的讀取出來,只需要驗證消息本身,還有消息摘要這類算法。摘要算法多用于信息的比對和驗證,使得在不暴露原始信息,以及縮小比對量的情況下保證結(jié)果的正確性,這里涉及的算法包括:MAC、MD5、SHA1、SHA256等。
對稱密鑰加密
對稱密鑰加密 Symmetric Key Algorithm 又稱為對稱加密、私鑰加密、共享密鑰加密:這類算法在加密和解密時使用相同的密鑰,或是使用兩個可以簡單的相互推算的密鑰,對稱加密的速度一般都很快。
分組密碼
分組密碼 Block Cipher 又稱為“分塊加密”或“塊加密”,將明文分成多個等長的模塊,使用確定的算法和對稱密鑰對每組分別加密解密。這也就意味著分組密碼的一個優(yōu)點在于可以實現(xiàn)同步加密,因為各分組間可以相對獨立。
與此相對應(yīng)的是流密碼:利用密鑰由密鑰流發(fā)生器產(chǎn)生密鑰流,對明文串進行加密。與分組密碼的不同之處在于加密輸出的結(jié)果不僅與單獨明文相關(guān),而是與一組明文相關(guān)。
分組密碼的工作模式 Block cipher mode of operation 描述加密每一個數(shù)據(jù)塊的過程,包括加密和認證的過程:
初始化向量
初始化向量 IV Initialization Vector 用于將加密隨機化,以便同樣的明文被多次加密也會產(chǎn)生不同的密文。
IV通常不需要保密,但不應(yīng)該在使用同一密鑰的情況下使用同一個IV。重用IV在CBC和CFB下會導(dǎo)致泄露明文首個塊的某些信息,而在OFB和CTR下會導(dǎo)致完全失去安全性。
填充
填充 Padding,塊密碼只能對確定長度的數(shù)據(jù)塊進行處理,而消息的長度通常都是可變的,因此在一些模式下,比如ECB、CBC,需要對最后一塊數(shù)據(jù)在加密前進行填充。
位填充:在信息后添加一個“設(shè)定”位"1",再添加“重設(shè)”位"0"至要求大小。此方法可用于填充任意長度的信息。... | 1011 1001 1101 0100 0010 0111 0000 0000 |
字節(jié)填充:用于可編碼為整數(shù)字節(jié)大小的信息
- ANSI X.923:使用"0"填充,直到最后一個字節(jié)定義填充的界限或者填充的字節(jié)數(shù)
... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 04 |
- ISO 10126:使用隨機數(shù)填充,直到最后一個字節(jié)定義填充的界限
... | DD DD DD DD DD DD DD DD | DD DD DD DD 81 A6 23 04 |
- PKCS7:使用需要填充的字節(jié)數(shù)為值來填充
... | DD DD DD DD DD DD DD DD | DD DD DD DD 04 04 04 04 |
- Zero Padding:直接使用"0"來填充
... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 00 |
電子密碼本
電子密碼本 ECB Electronic Codebook 模式:需要加密的消息按照塊密碼的塊大小被分為數(shù)個塊,并對每個塊進行獨立加密。這個模式的優(yōu)點在于模式簡單、有利于并行計算、誤差也不會被傳遞;但問題在于同樣的明文塊會被加密成相同的密文塊,因此不能很好的隱藏數(shù)據(jù)模式。
可以參考下圖,這種模式比較容易受到重放攻擊[Replay attack]:(https://en.wikipedia.org/wiki/Replay_attack)的威脅
密文分組鏈接
密文分組鏈接 CBC Cipher Block Chaining 模式:這種模式要求消息填充,以便保證每一個明文塊都是完整的一塊,每個明文塊先與前一個密文塊進行異或后加密,這樣每個密文塊都依賴于它前面的所有明文塊,而對于第一個塊,需要使用初始化向量。這種模式的優(yōu)點在于較好的安全性,但是加密過程是串行的,也就是不利于并行運算,可導(dǎo)致誤差傳遞,但是反過來的話,從相鄰的兩個密文塊即可得到一個明文塊,所以解密的過程是可以并行的。
填充密碼塊鏈接
填充密碼塊鏈接 PCBC Propagating Cipher Block Chaining, 或稱為明文密碼塊鏈接 Plaintext Cipher Block Chaining:可以使密文中的微小更改在解密時導(dǎo)致明文大部分錯誤的模式,并在加密的時候也具有相同的特性,這種方式主要用于Kerberos V4。
密文反饋
密文反饋 CFB Cipher Feedback 模式類似于CBC,可以將塊密碼變?yōu)樽酝降牧髅艽a,工作過程也類似,CFB的解密過程即使顛倒的CBC的加密過程。這種模式隱藏了明文模式,使得分組密碼轉(zhuǎn)化成了流模式,可以及時加密傳送小于分組的數(shù)據(jù),而不需要數(shù)據(jù)填充。而缺點與CBC類似,加密不能并行化,但解密可以。
輸出反饋
輸出反饋模式 OFB Output Feedback 將塊密碼變成同步的流密碼,用產(chǎn)生的密碼流的塊,與明文塊做異或,得到密文。同樣的,這種模式隱藏了明文模式,使得分組密碼轉(zhuǎn)化成了流模式,可以及時加密傳送小于分組的數(shù)據(jù),而不需要數(shù)據(jù)填充,而缺點是不能并行化。
計數(shù)器模式
計數(shù)器模式 CTR Counter Mode 同樣將塊密碼變?yōu)榱髅艽a,通過遞增一個加密計數(shù)器以產(chǎn)生連續(xù)的密鑰流,加解密過程均可以進行并行處理。
DES、3DES
數(shù)據(jù)加密標(biāo)準 DES Data Encryption Standard 是由IBM在美國國家安全局NSA授權(quán)下研制的一種使用56位密鑰的分組密碼算法,并于1977年被美國國家標(biāo)準局NBS公布成為美國商用加密標(biāo)準。但是因為DES固定的密鑰長度,逐漸的不再符合在開放式網(wǎng)絡(luò)中的安全要求,已經(jīng)于1998年被移出商用加密標(biāo)準,被更安全的AES標(biāo)準替代。
DES使用的Feistel Network網(wǎng)絡(luò)屬于對稱的密碼結(jié)構(gòu),對信息的加密和解密的過程極為相似或趨同,使得相應(yīng)的編碼量和線路傳輸?shù)囊笠矞p半。
DES是塊加密算法,將消息分成64位,即16個十六進制數(shù)為一組進行加密,加密后返回相同大小的密碼塊,這樣,從數(shù)學(xué)上來說,64位0或1組合,就有2^64種可能排列。DES密鑰的長度同樣為64位,但在加密算法中,每逢第8位,相應(yīng)位會被用于奇偶校驗而被算法丟棄,所以DES的密鑰強度實為56位。
3DES Triple DES,使用不同Key重復(fù)三次DES加密,加密強度更高,當(dāng)然速度也就相應(yīng)的降低。
AES
高級加密標(biāo)準 AES Advanced Encryption Standard 為新一代數(shù)據(jù)加密標(biāo)準,速度快,安全級別高。由美國國家標(biāo)準技術(shù)研究所NIST選取Rijndael于2000年成為新一代的數(shù)據(jù)加密標(biāo)準。
AES的區(qū)塊長度固定為128位,密鑰長度可以是128位、192位或256位。AES算法基于Substitution Permutation Network代換置列網(wǎng)絡(luò),將明文塊和密鑰塊作為輸入,并通過交錯的若干輪代換"Substitution"和置換"Permutation"操作產(chǎn)生密文塊。
AES加密過程是在一個4*4的字節(jié)矩陣(或稱為體State)上運作,初始值為一個明文區(qū)塊,其中一個元素大小就是明文區(qū)塊中的一個Byte,加密時,基本上各輪加密循環(huán)均包含這四個步驟:
AddRoundKey
“合并”:矩陣中的每個字節(jié)與該回合密鑰做XOR亦或運算,其中回合密鑰由主密鑰通過Rijndael密鑰生成方案生成,這個密鑰大小跟原矩陣一致。
SubBytes
“替換”:矩陣中的每個字節(jié)通過一個8位查找表對應(yīng)的特定字節(jié)所替換。這里的8位查找表為S-box(Substitution-box, 置換盒),用來模糊密鑰與密文之間的關(guān)系,實現(xiàn)輸入輸出的非線性特征。
ShiftRows
“行混淆”:矩陣中的每一行的各個字節(jié)循環(huán)向左方位移,位移量隨行數(shù)遞增。
MixColumns
“列混淆”:每一列的四個字節(jié)通過線性變換互相結(jié)合,即與一個固定的多項式做乘法。
安全性
已知的針對AES唯一的成功攻擊是旁道攻擊,2005年時使用緩存時序攻擊法,破解了一個裝載OpenSSL AES加密系統(tǒng)的客戶服務(wù)器。
針對區(qū)塊加密系統(tǒng)最常見的方式,是通過對加密循環(huán)次數(shù)較少的版本嘗試攻擊,然后改進算法后繼續(xù)攻擊高級版本,目前這個破解方法還不太實用。
另外由于AES的數(shù)據(jù)結(jié)構(gòu)具有井然有序的代數(shù)結(jié)構(gòu),有一個擔(dān)心就是相關(guān)的代數(shù)攻擊,目前基于此的有效攻擊方法也暫時沒有出現(xiàn)。
非對稱密鑰加密
非對稱密鑰加密 Asymmetric Key Cryptography 也可稱為 Public Key Cryptography 公開密鑰加密:需要兩個密鑰,分為公鑰和私鑰,一個用作加密而另外一個只能用于解密,而加密的密鑰并不能用來解密。
根據(jù)此特性,除了加解密的應(yīng)用外,還可以確保數(shù)字簽名的功能:某用戶用私鑰加密明文,任何人都可以用該用戶的公鑰解密密文,以此判定身份。
對稱密鑰需要一個安全的渠道可以交換共用的密鑰,而非對稱密鑰可以講加密公鑰公開發(fā)布;不過公鑰加密在計算上相當(dāng)復(fù)雜,性能遠比不上對稱加密,所以一般會利用公鑰加密來交換對稱密鑰,然后依靠對稱密鑰來傳輸具體的信息。
RSA
RSA是由三個人的名字組成 Ron Rivest、Adi Shamir、Leonard Adleman于1977年在MIT提出,并于1987年公布,是目前最常用的公鑰加密算法。
RSA算法的核心是極大整數(shù)的因式分解,理論基礎(chǔ)在于由兩個大質(zhì)數(shù)算出乘積很容易,但是要從一個極大整數(shù)因式分解得出兩個質(zhì)數(shù)卻很難。
RSA算法
隨機選取兩個不相等的質(zhì)數(shù) p、q
計算p、q的乘積 n = p*q
計算n的歐拉函數(shù) ??(n) = (p-1)(q-1)
p、q會被銷毀
隨機選取整數(shù)e,滿足條件 1<e<??(n),且e與??(n) 互質(zhì)
計算e對于??(n)的模反元素,整數(shù)d: ed ≡ 1 (mod ??(n))
這樣n、e、d即為密鑰相關(guān)數(shù)值,而通過冪運算取余實現(xiàn)加解密:
公鑰 (n, e): 信息 m 實現(xiàn)加密 c m? ≡ c (mod n)
私鑰 (n, d): 密文 c 實現(xiàn)解密 m c? ≡ m (mod n)
歐拉函數(shù):??(n)是指小于n的正整數(shù)中與n互質(zhì)的數(shù)的數(shù)目,而歐拉函數(shù)符合積性函數(shù),這也就意味著??(n)=??(pq)=??(p)??(q)
,而p\q為質(zhì)數(shù),也就意味著所有小于p\q的數(shù)都與p\q互質(zhì),也就是??(p)=p-1, ??(q)=q-1
,這樣最終可以得到公式??(n) = (p-1)(q-1)
模算數(shù)的同余關(guān)系 a≡b(mod n)
是指對于正整數(shù)n,兩個整數(shù)a和b對于模n同余。
模反元素、模逆元是指存在整數(shù)d,使得ed被??(n) 除的余數(shù)為1,即ed ≡ 1 (mod φ(n))
,等價于ed - 1 = kφ(n)
,而一般為得到d,即是對ex + φ(n)y = 1
這個二元一次方程求解。
歐拉定理表明若n、a為正整數(shù)且互質(zhì),則a^φ(n) ≡ 1(mod n)
。具體的證明加解密函數(shù)的正確性可以參見RSA算法原理
相比其他對稱算法,RSA要慢得多。在密鑰分配過程中,信息可能通過“中間人攻擊”被截取,所以一般需要通過可靠的第三方機構(gòu)簽發(fā)證書來防止這種攻擊。另外一種被稱為“時間攻擊”的方法,根據(jù)對特定消息加密時所需要的時間來判斷對應(yīng)的加密信息,這是因為RSA里面加密時所作的模指數(shù)運算是一個比特一個比特進行的,而比特為1時所花的運算比比特為0時的運算多很多,利用這個特性可以推導(dǎo)私鑰的內(nèi)容。當(dāng)然,最通用的破解是大數(shù)因式分解,這個取決于計算機的計算能力。
ECC
ECC即 Elliptic Curve Cryptography 橢圓曲線密碼學(xué),是基于橢圓曲線數(shù)學(xué)建立公開密鑰加密的算法。ECC的主要優(yōu)勢是在提供相當(dāng)?shù)陌踩燃壡闆r下,密鑰長度更小。
ECC的原理是根據(jù)有限域上的橢圓曲線上的點群中的離散對數(shù)問題ECDLP,而ECDLP是被因式分解問題更難的問題,是指數(shù)級的難度。而ECDLP定義為:給定素數(shù)p和橢圓曲線E,對Q=kP,在已知P,Q 的情況下求出小于p的正整數(shù)k。可以證明由k和P計算Q比較容易,而由Q和P計算k則比較困難。
是不是有點繞,好吧,我數(shù)學(xué)也差不多忘光了,了解一下是什么就可以了~~
數(shù)字簽名
數(shù)字簽名 Digital Signature 又稱公鑰數(shù)字簽名是一種用來確保數(shù)字消息或文檔真實性的數(shù)學(xué)方案。一個有效的數(shù)字簽名需要給接收者充足的理由來信任消息的可靠來源,而發(fā)送者也無法否認這個簽名,并且這個消息在傳輸過程中確保沒有發(fā)生變動。
數(shù)字簽名的原理在于利用公鑰加密技術(shù),簽名者將消息用私鑰加密,然后公布公鑰,驗證者就使用這個公鑰將加密信息解密并對比消息。一般而言,會使用消息的散列值來作為簽名對象。
消息摘要算法
散列函數(shù) Hash Function 又可稱為散列算法、哈希函數(shù),是一種從任何一種數(shù)據(jù)中創(chuàng)建小的數(shù)字“指紋”的方法。散列函數(shù)具有一個基本特性:如果兩個散列值是不相同的,那么這兩個散列值的原始輸入也是不相同的。這個特性是散列函數(shù)具有確定性的結(jié)果,而相應(yīng)的散列函數(shù)即被稱為單向散列函數(shù)。但是如果散列值相同,兩個輸入值可能相同也可能不同,這種情況成為散列碰撞。
密碼散列函數(shù) Cryptographic Hash Function 又可稱為加密散列函數(shù)、密碼散列函數(shù),屬于散列函數(shù)的一種,是一種單向函數(shù),它將一個不定長的輸入數(shù)據(jù)轉(zhuǎn)換成固定大小的結(jié)果,并且以這個結(jié)果很難回推輸入的數(shù)據(jù)。這種散列函數(shù)的輸入數(shù)據(jù),通常被稱為消息Message,而輸出的結(jié)果,經(jīng)常被稱為消息摘要Message Digest或摘要Digest。總的來說,密碼散列函數(shù)具有如下的重要特征:
- 具有確定性,即同樣的消息輸入具有同樣的散列結(jié)果。
- 對于任何一個給定的消息,能夠快速運算出散列數(shù)值
- 難以由一個已知的散列數(shù)值,去推算原始的消息
- 對于消息的任何微小的改動,都會導(dǎo)致散列結(jié)果的巨大改變
- 兩個不同的消息輸入,一定會產(chǎn)生不同的散列數(shù)值
除了被用作傳統(tǒng)的哈希函數(shù),而在數(shù)據(jù)索引、指紋等方面應(yīng)用外,密碼散列函數(shù)在信息安全方面有很多的應(yīng)用,包括數(shù)字簽名、消息認證碼、以及各種形式的認證。
MD5
消息摘要算法 MD5 Message Digest Algorithm 是一種密碼散列函數(shù),可以產(chǎn)生出一個128位,即16字節(jié)的散列值,用于確保信息的完整性。MD5由MD4、MD3、MD2改進而來,主要是增強了算法的復(fù)雜度和不可逆性。MD5目前已被證實無法防止碰撞攻擊,所以不適用于安全性認證,即不可用于SSL公開密鑰認證、數(shù)字簽名等方面。但是MD5具有簡單、穩(wěn)定、快速的特征,所以在一些普通數(shù)據(jù)的錯誤檢查應(yīng)用中依然被廣泛應(yīng)用,比如文件下載的MD5校驗和。
MD5以512位分組處理輸入的信息,每一組又被劃分為16個32位子分組,經(jīng)過特定的程序流程,生成四個32位分組數(shù)據(jù),最終這四組數(shù)據(jù)結(jié)合成128位的散列值作為最終的結(jié)果。
具體的算法過程為:
信息填充:使用起始1依次0的填充方式,將信息填充為對512求余為448,再加上最后一個64位的數(shù)字代表填充前的信息長度,最終結(jié)果為512的整數(shù)倍。
鏈接變量:MD5擁有4個32位的鏈接變量Chaining Variable作為整數(shù)參數(shù) A=0x01234567
, B=0x89abcdef
, C=0xfedcba98
, D=0x76543210
這其實是一個固定的常量狀態(tài)
四輪循環(huán):每輪循環(huán)的次數(shù)即是信息中512位信息分組的數(shù)目,而每輪循環(huán)分別采用如下圖中的一種函數(shù)
如圖所示為一次MD5運算:MD5的四輪循環(huán)共包括64次此種運算,每輪由16次MD5運算構(gòu)成。這里的F是一個非線性函數(shù),一個函數(shù)用在一次循環(huán)中。Mi代表32位的輸入消息塊,Kj代表32位的常量,<<<s代表左位移s位,"田"字代表模加運算。
簡單地說,MD5算法的核心其實就是用512位的信息塊來改變128位鏈接變量的狀態(tài),最終的狀態(tài)即是128輸出散列值。
SHA
安全散列算法 SHA Secure Hash Algorithms 包括一個密碼散列函數(shù)家族,是FIPS所認證的安全散列算法。
SHA-0:1993年發(fā)布,160位散列函數(shù),存在嚴重缺陷被很快撤回,為SHA-1的前身。
SHA-1:1995年發(fā)布,160位散列函數(shù),類似于MD5的算法,在很多安全協(xié)議中廣為使用,比如TLS、SSL、SSH等,被視為MD5的后繼者,2015年被Google正式宣布攻破。
SHA-2:2001年發(fā)布,擁有兩組散列函數(shù),包括32位字的SHA-256以及64位字的SHA-512,它還包括各種變種SHA-224、SHA-384、SHA-512/224、SHA-512/256(后綴數(shù)字即散列位數(shù)),尚未被有效攻破,但算法與SHA-1類似。
SHA-3:2005年發(fā)布,支持SHA-2的相同散列長度,但內(nèi)部結(jié)構(gòu)得到很大的更新,作為一個未來可替換的加密散列算法存在。
目前主流使用SHA-2,比如SHA-256,其算法過程與MD5類似:
- 首先SHA-256對于輸入報文有最大不超過2^64位的限制,輸入依然按照512位分組,產(chǎn)生的是256位的報文摘要。
- 填充比特位以1開始順位0,直至模512至448位,最后64位位原始報文的長度。
- 初始狀態(tài)變量為256位,為8個32位
A=0x6A09E667
,B=0xBB67AE85
,C=0x3C6EF372
,D=0xA54FF53A
,E=0x510E527F
,F=0x9B05688C
,G=0x1F83D9AB
,H=0x5BE0CD19
- 循環(huán)計算處理512位輸入報文分組,每組迭代64次計算
與MD5類似,簡單地說,SHA256算法的核心就是用512位的信息塊來改變256位鏈接變量的狀態(tài),最終的狀態(tài)即是256輸出散列值。
MAC
消息認證碼 MAC Message Authentication Code,又稱為消息鑒別碼、文件消息認證碼、訊息鑒別碼、信息認證碼等,是指經(jīng)過特定算法后產(chǎn)生的一小段信息,通過驗證消息傳遞過程中是否遭到更改以檢查某段消息的完整性,以及作為消息來源的身份驗證的一種方式,確認消息的來源。
MAC不會對信息保密,若要同時實現(xiàn)保密認證,需要同時對信息進行加密。在實際應(yīng)用中,通常會使用帶密鑰的散列函數(shù)HMAC,或者塊密碼的帶認證工作模式CBC-MAC。
這幅圖示表明消息的發(fā)送者通過MAC算法生成一個MAC的數(shù)據(jù)標(biāo)簽,然后隨原始消息一同發(fā)給接收者,而接收者通過同樣的MAC算法生成另外一個MAC數(shù)據(jù)標(biāo)簽,比較這兩者就可以判定消息是否在傳輸過程中被修改,從而判定數(shù)據(jù)傳輸?shù)耐暾浴?/p>
在這里需要避免重放攻擊 Replay Attacks,消息本身需要包含一些信息以便保證同樣的消息不會被重復(fù)發(fā)送,這種信息可以是時間戳、序號碼、或者一次性MAC等。
MAC與數(shù)字簽名的不同之處在于,MAC值的生成和驗證都是通過同一個密鑰實現(xiàn)的,所以發(fā)送者和接收者在建立連接前就需要確認密鑰,這與對稱密鑰類似。這也就意味著驗證法同樣可以生成簽名,所以簽名認證的意義就沒有了。
HMAC
密鑰散列消息認證碼 HMAC Keyed Hash Message Authentication Code 使用密碼散列函數(shù),結(jié)合一個加密密鑰,計算生成消息認證碼。HMAC既可以用來保證數(shù)據(jù)的完整性,也可以用作某個消息的身份驗證。
MD5、SHA都可以作為HMAC的散列算法被使用,相應(yīng)的HMAC算法就可以被稱為 HMAC-MD5, HMAC-SHA。
如圖所示,HMAC-SHA1的生成由兩個散列計算過程構(gòu)成,首先密鑰會被用來生成兩個密鑰 (Inner、Outer),第一個計算過程利用輸入消息和Inner密鑰生成內(nèi)部散列值,而第二個計算過程會利用內(nèi)部散列值和outer密鑰生成最終的散列值作為結(jié)果。這種方式可以有效地抵制長度擴展攻擊。
編碼
Base64
Base64 是一種基于64個可打印字符來表示二進制數(shù)據(jù)的表示方法,2的6次方為64,即以6個比特為一個單元,對應(yīng)某個可打印字符。三個字節(jié)有24個比特,對應(yīng)于4個Base64單元,即三個字節(jié)可表示4個可打印字符。
Base64嚴格意義不能算是一種加密方式,只是將文本變得不那么可以直接看出來而已。
在Base64中可打印字符包括A-Z、a-z、0-9,總計62,再加上可能因系統(tǒng)而不同的兩個可打印字符。Base64常用于處理文本數(shù)據(jù)的場合,處理一些二進制數(shù)據(jù),比如MIME的email、在XML中存儲數(shù)據(jù)等。
MIME
在MIME格式的電子郵件中,Base64可以將二進制的字節(jié)序列數(shù)據(jù)編碼成ASCII字符序列構(gòu)成的文本,使用時除了字母和數(shù)字外,加上加號"+"和斜杠"/",共計64個字符,等號"="用作后綴。另外,在電子郵件中,每76個字符后需要加一個回車換行,另外使用"="補足尾部不足3字節(jié)的部分。
破解
暴力破解法
暴力破解法 Brute-force attack 又可稱為窮舉法,即攻擊者會系統(tǒng)性的嘗試所有可能的密碼,直到找到真正的密碼為止。暴力破解的有效性取決于密碼的長度、復(fù)雜度等,如果暴力破解的耗時過長,就會導(dǎo)致破解沒有意義。與此相對應(yīng),為避免受到暴力破解的攻擊,我們可以添加一些防護手段,比如:增加密碼的長度與復(fù)雜度、在系統(tǒng)中限制密碼試錯的次數(shù)、定時修改密碼等。
字典攻擊
比暴力破解優(yōu)化點的一種方式叫做字典攻擊Dictionary Attack,這種方法就是給密碼鎖定某個范圍,比如英文單詞、生日的數(shù)字組合等,所有的英文單詞大約10萬個左右,這樣就可以大大縮小密碼的查找范圍,相比暴力破解可以縮短破譯時間。
字典攻擊是根據(jù)現(xiàn)有或常用的組合測試破解密碼。
彩虹表
彩虹表 Rainbow Table 是一個用于加密散列函數(shù)逆運算的預(yù)先計算好的表,常用于破解加密過的密碼散列。這種方式常用于包含有限字符固定長度純文本密碼的加密,是一種典型的以空間換時間的方式,相比暴力破解使用較少的計算能力而更多的存儲空間。它可以針對各種散列算法,已被確認有效的包括MD5和SHA-1,一般主流的彩虹表都在100G以上。
彩虹表是針對特定的算法,尤其是不對稱算法,比如MD5,進行有效破解的一種方法。
彩虹表采用哈希鏈的存儲方式存儲字典,它只需要保存這個鏈的首位的值,而中間值是通過哈希函數(shù)進行推算,這樣可以對時間和空間進行平衡。一種比較好的理解方式是:暴力破解是將所有可能都列出來一一嘗試,而彩虹表是按照某些規(guī)律和特征分組,當(dāng)發(fā)現(xiàn)某個特征符合當(dāng)前情況時,在這一個方向上細化繼續(xù)嘗試相關(guān)的可能性。
哈希鏈
假設(shè)存在哈希函數(shù)H和有限密碼集合P
`H(p) = h`表示P集合里的元素p經(jīng)哈希函數(shù)生成結(jié)果
歸約函數(shù)R:影射散列值h在集合P中對應(yīng)的密碼p,非H的反函數(shù)
哈希鏈:使用歸約函數(shù)和哈希函數(shù)行程交替鏈
aaaaaa -H-> 281DAF40 -R-> sgfnyd -H-> 920ECF10 -R-> kiebgt
存儲時只保存起點aaaaaa和終點kiebgt
對于需要破解的哈希值920ECF10
應(yīng)用函數(shù)R得到 920ECF10 -R-> kiebgt
因為對應(yīng)終點,可以得到起點aaaaaa
再計算哈希鏈
aaaaaa -H-> 281DAF40 -R-> sgfnyd -H-> 920ECF10 -R
從而確認密碼為sgfnyd
實際使用中,哈希鏈并不總會包含所需要查找的哈希值,并且以h開始的鏈可能會和起點在h鏈之后的某個查找鏈重合。這種無法查找的情況被稱為誤報。這種簡單的哈希鏈存在很多缺陷,其中有一個問題就是,如果兩條鏈中的任何兩個點碰撞了,他們后續(xù)的所有點都將重合,這會導(dǎo)致查找表不能夠覆蓋足夠多的密碼。
為了解決簡單的哈希鏈中的碰撞問題,彩虹表選用一系列相關(guān)的衰減函數(shù)R1、R2... Rk來代替原先的衰減函數(shù)R。這樣如果發(fā)生碰撞后,可以找出重點相同的鏈,并生成新的鏈來補充表。從而避免鏈的重合而降低碰撞的次數(shù)。不過這也意味著我們需要計算k條不同的鏈。
實際應(yīng)用方面,某些網(wǎng)站的用戶密碼數(shù)據(jù)庫泄露,攻擊者就可以通過使用彩虹表破解數(shù)據(jù)庫中存儲的密碼散列值,當(dāng)然,如果存的是明文密碼的話~~~ 就無話可說了。對于彩虹表的防御,一般可以使用加鹽Salt的方式,改變哈希函數(shù)的形式,如果函數(shù)形式變了,而彩虹表是針對特定哈希函數(shù)而生成的,那么現(xiàn)有的彩虹表就無效了。
旁道攻擊
旁道攻擊 Side-Channel Attacks 又稱為旁路攻擊、側(cè)信道攻擊:一種針對密碼設(shè)備的新型攻擊技術(shù),基于從密碼系統(tǒng)的物理視線中獲取信息,比如時間信息、功率消耗、電磁泄露、聲音等額外的信息來源。通過功率分析嘗試破解RSA的實例就是通過RSA迭代是是否有懲罰而導(dǎo)致處理器功率發(fā)生變化的差異而用來分析加密密鑰。
中間人攻擊
中間人攻擊 MITM Middle in the Middle Attack 是指攻擊者秘密的傳遞并可能改變兩方的通信,而通信雙方仍然相信他們是直接通信的。
為了抵御在不安全的通道的通信需求,我們需要一些抵御中間人攻擊的一些認證技術(shù)方案:公鑰基礎(chǔ)建設(shè)PKI使用公認的數(shù)字證書認證機構(gòu)CA認證通信端;延遲測試的預(yù)估時間的超出等。
長度擴展攻擊
長度擴展攻擊 Length Extension Attack 針對某些允許包含額外信息的加密散列函數(shù)的攻擊手段。該攻擊方法適用于在消息與密鑰長度已知的情況下,所有采取了H(密鑰||消息)此類構(gòu)造的散列函數(shù),包括MD5、SHA-1、SHA-2等,而HMAC、SHA-3不受此影響。
攻擊的原理在于散列函數(shù)的算法會使用輸入消息改變內(nèi)部處理函數(shù)的狀態(tài),而這個狀態(tài)最終生成輸出的散列摘要,因此存在著從散列摘要重新構(gòu)建內(nèi)部狀態(tài)、并用于處理攻擊者偽造的數(shù)據(jù)的可能性。從而,攻擊者得以擴充消息的長度,并為新的偽造消息計算出合法的散列摘要。
重放攻擊
重放攻擊 Replay Attack 是一種通過欺騙性的重復(fù)發(fā)送或者延遲有效消息的網(wǎng)絡(luò)攻擊手段。
防止重放攻擊的一個手段是使用在加密信息片段上附上會話ID和編號,使用這種唯一且隨機的標(biāo)簽,使得攻擊者不能簡單的重放信息。其他的方法包括一次性密碼、時間戳等。
碰撞攻擊
碰撞攻擊 Collision Attack 是指找出兩個不同的輸入值卻導(dǎo)致同樣的散列值的一種方式,目前已經(jīng)可以有效地攻擊MD5和SHA-1。
有效地利用碰撞,可以使得所有數(shù)據(jù)全部碰撞,人為的將哈希表變成一個退化的單鏈表,使得各種操作的時間均提升了一個數(shù)量級,因此大量消耗CPU資源,導(dǎo)致系統(tǒng)無法快速響應(yīng)請求,從而達到拒絕服務(wù)供給Dos的目的。
代數(shù)攻擊
與傳統(tǒng)的“統(tǒng)計”攻擊方法不同,使用代數(shù)方法對密碼體制進行密碼分析的攻擊方法叫做代數(shù)攻擊:將加密活動描述為輸入密鑰和輸出之間的多元方程組,并通過求解低次超定稀疏方程組來回復(fù)密鑰。它的優(yōu)勢在于所需要的數(shù)據(jù)量非常少。
代數(shù)攻擊適用于所有的加密方式,前景很好,但是現(xiàn)有的研究還不太充分。
又是一個需要深厚數(shù)學(xué)功底的例子~~