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