加密與認(rèn)證技術(shù)的區(qū)別?

加密并不等于認(rèn)證,那么他們之間是有什么異同之處呢?怎樣可以分清楚什么是認(rèn)證技術(shù),什么又是加密呢?

加密與認(rèn)證之間有哪些區(qū)別?

加密是指對(duì)數(shù)據(jù)進(jìn)行操作后,沒(méi)有密碼無(wú)法打開數(shù)據(jù)或解密數(shù)據(jù)。在簡(jiǎn)單的對(duì)稱加密中,同一個(gè)密鑰被用于加密和解密。在非對(duì)稱加密中,可以使用用戶的公鑰對(duì)信息加密,使得只有對(duì)應(yīng)私鑰的擁有者才能讀取它。

認(rèn)證是呈現(xiàn)信息,使其抗篡改(通常在某一非常低的概率之內(nèi),小于1除以已知宇宙中粒子的數(shù)量),同時(shí)也證明它起源于預(yù)期發(fā)送者的過(guò)程。

注意:當(dāng)本文提及真實(shí)性時(shí),是專門指的信息真實(shí)性,而不是身份真實(shí)性。這是一個(gè)PKI和密鑰管理問(wèn)題,我們可能在未來(lái)的博客中詳細(xì)說(shuō)明。

就CIA triad而言:加密提供機(jī)密性,認(rèn)證提供完整性。

加密不提供完整性;被篡改的信息(通常)還能解密,但結(jié)果通常會(huì)是垃圾。單獨(dú)加密也不抑制惡意第三方發(fā)送加密信息。

認(rèn)證不提供機(jī)密性;可以為明文信息提供抗篡改。

加密

我們之前定義了加密,并且詳細(xì)說(shuō)明了它是提供機(jī)密性,但不提供完整性和真實(shí)性的。你可以篡改加密信息,并將產(chǎn)生的垃圾給予接收者。而且你甚至可以利用這種垃圾產(chǎn)生機(jī)制,來(lái)繞過(guò)安全控制。

考慮在加密cookie的情況下,有如下代碼:

上面的代碼提供了在密碼段鏈接模塊的AES加密,如果你傳入32字節(jié)的字符串作為$key,你甚至可以聲稱,為你的cookie提供了256位的AES加密,然后人們可能被誤導(dǎo)相信它是安全的。

加密與認(rèn)證技術(shù)的區(qū)別?

如何攻擊未經(jīng)認(rèn)證的加密

比方說(shuō),在登錄到這個(gè)應(yīng)用程序之后,你會(huì)發(fā)現(xiàn)你收到一個(gè)會(huì)話cookie,看起來(lái)就像

kHv9PAlStPZaZJHIYXzyCnuAhWdRRK7H0cNVUCwzCZ4M8fxH79xIIIbznxmiOxGQ7td8LwTzHFgwBmbqWuB+sQ==

讓我們改變一個(gè)字節(jié)的第一塊(初始化向量),并反復(fù)發(fā)送我們的新的cookie,直到出現(xiàn)一些變化。應(yīng)該采取共4096次HTTP請(qǐng)求,以嘗試變量IV所有可能的單字節(jié)變化。在上面的例子中,經(jīng)過(guò)2405次請(qǐng)求后,我們得到一個(gè)看起來(lái)像這樣的字符串:

kHv9PAlStPZaZZHIYXzyCnuAhWdRRK7H0cNVUCwzCZ4M8fxH79xIIIbznxmiOxGQ7td8LwTzHFgwBmbqWuB+sQ==

相比之下,在base64編碼的cookie中只有一個(gè)字符不同(kHv9PAlStPZaZ J vs kHv9PAlStPZaZ Z):

- kHv9PAlStPZaZJHIYXzyCnuAhWdRRK7H0cNVUCwzCZ4M8fxH79xIIIbznxmiOxGQ7td8LwTzHFgwBmbqWuB+sQ==

+ kHv9PAlStPZaZZHIYXzyCnuAhWdRRK7H0cNVUCwzCZ4M8fxH79xIIIbznxmiOxGQ7td8LwTzHFgwBmbqWuB+sQ==

我們存儲(chǔ)在這個(gè)cookie里的原始數(shù)據(jù),是看起來(lái)像這樣的數(shù)組:

根據(jù)底層應(yīng)用程序的設(shè)置方法,你或許可以翻轉(zhuǎn)一位進(jìn)而提升成為一名管理員。即使你的cookie是加密的。 如果你想再現(xiàn)我們的結(jié)果,我們的加密密鑰是十六進(jìn)制下的:000102030405060708090a0b0c0d0e0f

認(rèn)證

如上所述,認(rèn)證旨在提供信息的完整性(我們指顯著抗篡改能力),而這證明它來(lái)自預(yù)期的源(真實(shí)性)。這樣做的典型方法是,為信息計(jì)算一個(gè)密鑰散列消息認(rèn)證碼(HMAC的簡(jiǎn)稱),并將信息與它連結(jié)。

重要的是,這里使用一個(gè)適當(dāng)?shù)墓9ぞ?,如HMAC,而不僅僅是一個(gè)簡(jiǎn)單的散列函數(shù)。

我在這兩個(gè)函數(shù)名前面加了unsafe,是因?yàn)樗鼈冞€是易受到一些缺點(diǎn)的危害:

Timing Attacks

Chosen Prefix Attacks on MD5 (PDF)

Non-strict equality operator bugs (largely specific to PHP)

現(xiàn)在,我們有點(diǎn)接近我們強(qiáng)大的對(duì)稱加密認(rèn)證的目標(biāo)。

加密并不是認(rèn)證,加密提供的是用加密算法加密過(guò)后的數(shù)據(jù)的信息,只是防止數(shù)據(jù)泄漏,并不能防止對(duì)數(shù)據(jù)的破壞。認(rèn)證是提供一個(gè)完整性,一定不能把加密和認(rèn)證技術(shù)混為一談。