如何正確地使用加密與認證技術(6)
0x06 使用關聯數據的認證加密
在我們前面的示例中,我們集中精力于,同時使用加密和認證,使其作為必須小心使用的單獨組件,以避免加密的悲劇。具體而言,我們專注于密碼段鏈接模塊的AES加密。
然而,密碼學家已經開發(fā)出更新,更具有彈性的加密模型,其加密和認證信息在同一操作。這些模型被稱為AEAD模型(Authenticated Encryption with Associated Data)。關聯數據意味著,無論你的應用程序需要什么進行認證,都不加密。
AEAD模型通常用于有狀態(tài)的目的,如網絡通信中,其中一個隨機數可以很容易地管理。
AEAD兩個可靠的實現是AES-GCM和ChaCha20-Poly1305。
AES-GCM是Galois/Counter模式中的高級加密標準(又名Rijndael算法加密)。這種模式在OpenSSL的最新版本中加入,但它目前在PHP中還不被支持。
ChaCha20-Poly1305結合了ChaCha20流密碼與Poly1305消息認證碼。這種模式在libsodium PHP擴展可用。Sodium::crypto_aead_chacha20poly1305_encrypt() Sodium::crypto_aead_chacha20poly1305_decrypt()
總結一下,你該記住的
加密不是認證
加密提供機密性
認證提供完整性
將兩者混為一談你就得自擔風險
為了完成CIA triad,你需要單獨解決可用性。這通常不是一個加密問題。
更重要的是:在密碼學專家的監(jiān)督下,使用具有韌性被證實記錄的庫,而不是自己在那里閉門造車,你會好得多。
如何正確地使用加密與認證技術(6)




