如何正確地使用加密與認證技術

  在密碼學專家之中,“加密並不是認證”是一個簡單的共識。但很多不瞭解密碼學的開發者,並不知道這句話的意義。如果這個知識更廣為人知和深入理解,那麼將會避免很多的設計錯誤。

  這一概念本身並不困難,但在表面之下,還有更多豐富的細節和玄妙之處有待發現。本文就是講述開發者對於加密和認證二者的混淆與誤用,並附上了優秀的解決方案。

  0x01 加密與認證之間有哪些區別?

  加密是呈現資訊,使其在沒有正確的金鑰情況下,變得難以卒讀的過程。在簡單的對稱加密中,同一個金鑰被用於加密和解密。在非對稱加密中,可以使用使用者的公鑰對資訊加密,使得只有對應私鑰的擁有者才能讀取它。

  認證是呈現資訊,使其抗篡改***通常在某一非常低的概率之內,小於1除以已知宇宙中粒子的數量***,同時也證明它起源於預期傳送者的過程。

  注意:當本文提及真實性時,是專門指的資訊真實性,而不是身份真實性。這是一個PKI和金鑰管理問題,我們可能在未來的部落格中詳細說明。

  就CIA triad而言:加密提供機密性,認證提供完整性。

  加密不提供完整性;被篡改的資訊***通常***還能解密,但結果通常會是垃圾。單獨加密也不抑制惡意第三方傳送加密資訊。

  認證不提供機密性;可以為明文資訊提供抗篡改。

  在程式設計師中,常見的錯誤是混淆這兩個概念。你能很容易找到這樣的一個庫或者框架:加密cookie資料,然後在僅僅解密它之後就無條件地信任與使用之。