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