如何正確地使用加密與認(rèn)證技術(shù)
在密碼學(xué)專家之中,“加密并不是認(rèn)證”是一個簡單的共識。但很多不了解密碼學(xué)的開發(fā)者,并不知道這句話的意義。如果這個知識更廣為人知和深入理解,那么將會避免很多的設(shè)計錯誤。
這一概念本身并不困難,但在表面之下,還有更多豐富的細(xì)節(jié)和玄妙之處有待發(fā)現(xiàn)。本文就是講述開發(fā)者對于加密和認(rèn)證二者的混淆與誤用,并附上了優(yōu)秀的解決方案。
0x01 加密與認(rèn)證之間有哪些區(qū)別?
加密是呈現(xiàn)信息,使其在沒有正確的密鑰情況下,變得難以卒讀的過程。在簡單的對稱加密中,同一個密鑰被用于加密和解密。在非對稱加密中,可以使用用戶的公鑰對信息加密,使得只有對應(yīng)私鑰的擁有者才能讀取它。
認(rèn)證是呈現(xiàn)信息,使其抗篡改(通常在某一非常低的概率之內(nèi),小于1除以已知宇宙中粒子的數(shù)量),同時也證明它起源于預(yù)期發(fā)送者的過程。
注意:當(dāng)本文提及真實性時,是專門指的信息真實性,而不是身份真實性。這是一個PKI和密鑰管理問題,我們可能在未來的博客中詳細(xì)說明。
就CIA triad而言:加密提供機(jī)密性,認(rèn)證提供完整性。
加密不提供完整性;被篡改的信息(通常)還能解密,但結(jié)果通常會是垃圾。單獨加密也不抑制惡意第三方發(fā)送加密信息。
認(rèn)證不提供機(jī)密性;可以為明文信息提供抗篡改。
在程序員中,常見的錯誤是混淆這兩個概念。你能很容易找到這樣的一個庫或者框架:加密cookie數(shù)據(jù),然后在僅僅解密它之后就無條件地信任與使用之。