如何正确地使用加密与认证技术(6)
0x06 使用关联数据的认证加密
在我们前面的示例中,我们集中精力于,同时使用加密和认证,使其作为必须小心使用的单独组件,以避免加密的悲剧。具体而言,我们专注于密码段链接模块的AES加密。
然而,密码学家已经开发出更新,更具有弹性的加密模型,其加密和认证信息在同一操作。这些模型被称为AEAD模型(Authenticated Encryption with Associated Data)。关联数据意味着,无论你的应用程序需要什么进行认证,都不加密。
AEAD模型通常用于有状态的目的,如网络通信中,其中一个随机数可以很容易地管理。
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,你需要单独解决可用性。这通常不是一个加密问题。
更重要的是:在密码学专家的监督下,使用具有韧性被证实记录的库,而不是自己在那里闭门造车,你会好得多。