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

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

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

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

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

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

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

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

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

加密

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

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

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

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

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

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

kHv9PAlStPZaZJHIYXzyCnuAhWdRRK7H0cNVUCwzCZ4M8fxH79xIIIbznxmiOxGQ7td8LwTzHFgwBmbqWuB+sQ==

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

kHv9PAlStPZaZZHIYXzyCnuAhWdRRK7H0cNVUCwzCZ4M8fxH79xIIIbznxmiOxGQ7td8LwTzHFgwBmbqWuB+sQ==

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

- kHv9PAlStPZaZJHIYXzyCnuAhWdRRK7H0cNVUCwzCZ4M8fxH79xIIIbznxmiOxGQ7td8LwTzHFgwBmbqWuB+sQ==

+ kHv9PAlStPZaZZHIYXzyCnuAhWdRRK7H0cNVUCwzCZ4M8fxH79xIIIbznxmiOxGQ7td8LwTzHFgwBmbqWuB+sQ==

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

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

認(rèn)證

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

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

我在這兩個函數(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)大的對稱加密認(rèn)證的目標(biāo)。

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