1. 加密基础与原理
1.1 加密与哈希的区别
在数据保护领域,加密和 哈希 是两类常见技术,但目标不同:加密是将明文转换为密文,可逆,依赖密钥;哈希是把任意长度数据映射为固定长度摘要,不可逆,常用于完整性校验。下列要点尤为关键:密钥的机密性决定了系统的安全性。
此外,对称加密和 非对称加密的区分也是入门的基石:对称加密通常速度更快,适合大数据量场景;非对称加密虽然慢,但提供了公钥可公开、私钥保密的特性,常用于密钥交换和数字签名。
1.2 常见术语与概念
要理解加密实现,需掌握若干核心术语:密钥、初始化向量(IV)、模式(如 CBC、GCM)、填充、认证性。在对称加密中,AES-256-CBC 是常用的组合之一,但若要同时保证机密性与完整性,AES-256-GCM 或 Libsodium 的 secretbox 等更安全的模式更受推荐。
2. 在 PHP 中实现对称加密
2.1 常用算法与模式
在 PHP 应用中,最常使用的对称加密算法包括 AES-256-CBC、AES-256-GCM 等。CBC 模式需要额外的校验码(MAC)来实现数据完整性,而 GCM 则将机密性与完整性合并为一个认证加密模式,简化实现并提升安全性。
当选择算法与模式时,需要关注 密钥长度、IV 长度、以及 填充策略。对于 AES-256,通常需要 32 字节密钥,IV 常见为 16 字节;使用 GCM 时,IV/Nonce 的随机性尤为重要,以避免重放攻击与密文重复利用。
2.2 OpenSSL 的实现示例
OpenSSL 提供了 openssl_encrypt 与 openssl_decrypt 两个核心函数,支持多种算法和模式。实现要点包括:密钥对齐长度、IV 的随机性、以及数据的编码与解码方式。下面给出一个简化的示例,展示如何在不泄露明文的情况下进行加解密。
在上述实现中,密钥通过哈希派生以确保固定长度,即使原始密码长度不同也能工作;IV使用随机生成,确保同一明文多次加密的输出不同,从而增强安全性;Base64 编码便于数据库或网络传输。
2.3 代码演示:对称加密的完整流程
完整流程包含密钥管理、IV 派生以及密文存储格式,下面的演示展示了如何进行一次加密以及随后的解密,保持数据可用性与安全性。
3. 使用 Libsodium 的现代加密
3.1 选择 Libsodium 的原因
Libsodium 提供现代化的加密构造,secretbox 系列实现了高效的秘密密钥加密,并内置了 认证标签,避免了单纯加密带来的完整性风险。与 OpenSSL 相比,它的正确使用约束更强,降低了错误实现的概率。
在 PHP 中,sodium 扩展提供了一组便捷 API,例如 sodium_crypto_secretbox、sodium_crypto_secretbox_open,以及随机数与非ces。请注意非ces大小通常固定,且应与密钥一起安全存储。
3.2 示例:使用 secretbox 进行对称加密
下面的示例展示了如何使用 sodium_crypto_secretbox 进行加密和解密,并将 nonce 与 密文 一起保存以便后续解密。
4. 在实际应用中的安全注意点
4.1 密钥管理与轮换
在生产系统中,密钥应存放在安全的环境变量、密钥管理服务或硬件安全模块,而不是硬编码到代码中。定期轮换密钥并具备可审计的轮换流程,是对抗长期暴露风险的重要手段。

这也意味着要将密钥与密文的绑定限制在可控范围内,尽量使每个数据块使用独立的密钥或 唯一的随机和不可预测的 IV/nonce,以防止重放和重复利用。
4.2 输出格式与传输
无论使用哪种加密方案,密文输出通常需要编码(如 Base64)并与 IV/nonce 一起存储,以便解密时正确恢复明文。保持输出格式的一致性有利于日志、数据库和 API 的集成。


