一、什么是非对称加密?
非对称加密(Asymmetric Encryption),又称公钥加密,是一种使用两把不同密钥(公钥和私钥)进行加密和解密的密码学技术。其核心特性是:
- 公钥(Public Key):可公开分发,用于加密数据或验证签名。
- 私钥(Private Key):严格保密,用于解密数据或生成签名。
1. 与对称加密的区别
特性 |
对称加密 |
非对称加密 |
密钥数量 |
1把密钥(共享) |
2把密钥(公钥+私钥) |
加密速度 |
快(适合大数据量) |
慢(计算复杂度高) |
核心用途 |
数据加密、密钥交换 |
密钥交换、数字签名、身份认证 |
2. 历史背景
非对称加密的里程碑算法是 RSA(1977年提出),后续演进出 ECC(椭圆曲线加密,2004年提出)等更高效的算法。
二、非对称加密的核心原理
1. 数学基础
非对称加密基于数论难题,常见实现方式:
- RSA:基于大整数分解(将大素数乘积分解为原始素数)的困难性。
- ECC:基于椭圆曲线离散对数问题的困难性。
2. 加密与解密流程
- 密钥生成:通过算法生成一对公私钥(如RSA)。
- 加密过程:使用公钥加密明文,得到密文(只有私钥能解密)。
- 解密过程:使用私钥解密密文,恢复明文。
3. 数字签名
- 签名生成:用私钥对数据哈希值加密,生成签名。
- 签名验证:用公钥验证签名的合法性,确认数据完整性和来源可信性。
三、PHP中的非对称加密实现
1. RSA密钥生成
1 2 3 4 5 6 7 8 9
| <?php
exec('openssl genpkey -algorithm RSA -out private_key.pem -bits 2048'); exec('openssl rsa -in private_key.pem -out public_key.pem -pubout');
$privateKey = file_get_contents('private_key.pem'); $publicKey = file_get_contents('public_key.pem'); ?>
|
2. 使用OpenSSL进行加密/解密
加密示例(使用公钥)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <?php function rsaEncrypt($data, $publicKey) { $resource = openssl_pkey_get_public($publicKey); $encrypted = openssl_public_encrypt( $data, $ciphertext, $resource, OPENSSL_PKCS1_PADDING ); if ($encrypted === false) { throw new Exception("加密失败"); } return base64_encode($ciphertext); }
$plaintext = "Hello, this is a secret message!"; $ciphertext = rsaEncrypt($plaintext, $publicKey); echo "加密结果:" . $ciphertext . "\n"; ?>
|
解密示例(使用私钥)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <?php function rsaDecrypt($ciphertext, $privateKey) { $resource = openssl_pkey_get_private($privateKey); $decrypted = openssl_private_decrypt( base64_decode($ciphertext), $plaintext, $resource, OPENSSL_PKCS1_PADDING ); if ($decrypted === false) { throw new Exception("解密失败"); } return $plaintext; }
$decryptedText = rsaDecrypt($ciphertext, $privateKey); echo "解密结果:" . $decryptedText . "\n"; ?>
|
3. 数字签名与验证
签名生成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <?php function signData($data, $privateKey) { $hash = hash('sha256', $data); $signature = openssl_sign( $hash, $signature, $privateKey, OPENSSL_ALGO_SHA256 ); if ($signature === false) { throw new Exception("签名失败"); } return base64_encode($signature); }
$signature = signData("Hello, World!", $privateKey); echo "数字签名:" . $signature . "\n"; ?>
|
签名验证
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <?php function verifySignature($data, $signature, $publicKey) { $hash = hash('sha256', $data); $result = openssl_verify( $hash, base64_decode($signature), $publicKey, OPENSSL_ALGO_SHA256 ); return $result === 1; }
$isValid = verifySignature("Hello, World!", $signature, $publicKey); echo "签名验证结果:" . ($isValid ? "成功" : "失败") . "\n"; ?>
|
四、非对称加密的最佳实践
1. 密钥管理原则
- 私钥保护:存储在安全介质(如HSM、硬件密钥)中,禁止暴露。
- 密钥轮换:定期更换密钥(建议RSA 2048位密钥至少使用3年后更换)。
- 权限控制:限制私钥的访问权限(如Linux下设置
chmod 600 private_key.pem
)。
2. 算法选择建议
- 优先使用ECC:在相同安全强度下,密钥长度更短(例如ECC-256 ≈ RSA-3072)。
- 避免过时算法:禁用RSA-1024及以下弱密钥。
3. 应用场景
- SSL/TLS通信:浏览器与服务器通过非对称加密交换对称密钥。
- SSH密钥认证:替代密码登录,提升服务器安全性。
- 数字证书(如SSL证书、代码签名证书):绑定公钥到实体身份。
- JWT签名:使用私钥签名令牌,客户端用公钥验证。
五、安全注意事项
- 防止中间人攻击:首次交换公钥时需通过可信渠道(如HTTPS证书)。
- 填充攻击防护:禁用不安全的填充模式(如PKCS#1 v1.5),改用OAEP填充。
- 密钥泄露应急:立即吊销受影响证书并生成新密钥对。
六、总结
非对称加密是现代密码学的基石,广泛应用于安全通信、身份认证等领域。PHP开发者可通过OpenSSL扩展实现基础功能,但在生产环境中需结合证书权威(CA)和安全密钥存储方案构建完整的安全体系。