喜迎
春节

非对称加密技术详解与PHP实现


一、什么是非对称加密?

非对称加密(Asymmetric Encryption),又称公钥加密,是一种使用两把不同密钥(公钥和私钥)进行加密和解密的密码学技术。其核心特性是:

  • 公钥(Public Key):可公开分发,用于加密数据或验证签名。
  • 私钥(Private Key):严格保密,用于解密数据或生成签名。

1. 与对称加密的区别

特性 对称加密 非对称加密
密钥数量 1把密钥(共享) 2把密钥(公钥+私钥)
加密速度 快(适合大数据量) 慢(计算复杂度高)
核心用途 数据加密、密钥交换 密钥交换、数字签名、身份认证

2. 历史背景

非对称加密的里程碑算法是 RSA(1977年提出),后续演进出 ECC(椭圆曲线加密,2004年提出)等更高效的算法。


二、非对称加密的核心原理

1. 数学基础

非对称加密基于数论难题,常见实现方式:

  • RSA:基于大整数分解(将大素数乘积分解为原始素数)的困难性。
  • ECC:基于椭圆曲线离散对数问题的困难性。

2. 加密与解密流程

  1. 密钥生成:通过算法生成一对公私钥(如RSA)。
  2. 加密过程:使用公钥加密明文,得到密文(只有私钥能解密)。
  3. 解密过程:使用私钥解密密文,恢复明文。

3. 数字签名

  • 签名生成:用私钥对数据哈希值加密,生成签名。
  • 签名验证:用公钥验证签名的合法性,确认数据完整性和来源可信性。

三、PHP中的非对称加密实现

1. RSA密钥生成

1
2
3
4
5
6
7
8
9
<?php
// 生成RSA密钥对(2048位)
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. 应用场景

  1. SSL/TLS通信:浏览器与服务器通过非对称加密交换对称密钥。
  2. SSH密钥认证:替代密码登录,提升服务器安全性。
  3. 数字证书(如SSL证书、代码签名证书):绑定公钥到实体身份。
  4. JWT签名:使用私钥签名令牌,客户端用公钥验证。

五、安全注意事项

  1. 防止中间人攻击:首次交换公钥时需通过可信渠道(如HTTPS证书)。
  2. 填充攻击防护:禁用不安全的填充模式(如PKCS#1 v1.5),改用OAEP填充。
  3. 密钥泄露应急:立即吊销受影响证书并生成新密钥对。

六、总结

非对称加密是现代密码学的基石,广泛应用于安全通信、身份认证等领域。PHP开发者可通过OpenSSL扩展实现基础功能,但在生产环境中需结合证书权威(CA)安全密钥存储方案构建完整的安全体系。


文章作者: Crazy Boy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Crazy Boy !
评 论
 上一篇
对称加密:一把钥匙开一把锁
对称加密:一把钥匙开一把锁
今天,咱们来聊聊对称加密,这可是密码学里的“老大哥”,至今仍然在保护着我们的大量数据。 对称加密,顾名思义,就是加密和解密用的是同一把钥匙。就像你家大门,用同一把钥匙锁门和开门。这种加密方式的特点是速度快,效率高,适合加密大量数据。 对称加
2024-03-18
下一篇 
非对称加密:两把钥匙,各司其职
非对称加密:两把钥匙,各司其职
今天,咱们来聊聊非对称加密,这可是密码学里的“黑科技”,它用两把钥匙,一把公开,一把私藏,就像你的保险箱,一把钥匙给别人放东西,一把钥匙你自己开箱。 非对称加密,也叫公钥密码学,它的特点是加密和解密用的是不同的密钥。就像你有一把公开的“邮箱
2024-03-18

一、什么是非对称加密?

非对称加密(Asymmetric Encryption),又称公钥加密,是一种使用两把不同密钥(公钥和私钥)进行加密和解密的密码学技术。其核心特性是:

  • 公钥(Public Key):可公开分发,用于加密数据或验证签名。
  • 私钥(Private Key):严格保密,用于解密数据或生成签名。

1. 与对称加密的区别

特性 对称加密 非对称加密
密钥数量 1把密钥(共享) 2把密钥(公钥+私钥)
加密速度 快(适合大数据量) 慢(计算复杂度高)
核心用途 数据加密、密钥交换 密钥交换、数字签名、身份认证

2. 历史背景

非对称加密的里程碑算法是 RSA(1977年提出),后续演进出 ECC(椭圆曲线加密,2004年提出)等更高效的算法。


二、非对称加密的核心原理

1. 数学基础

非对称加密基于数论难题,常见实现方式:

  • RSA:基于大整数分解(将大素数乘积分解为原始素数)的困难性。
  • ECC:基于椭圆曲线离散对数问题的困难性。

2. 加密与解密流程

  1. 密钥生成:通过算法生成一对公私钥(如RSA)。
  2. 加密过程:使用公钥加密明文,得到密文(只有私钥能解密)。
  3. 解密过程:使用私钥解密密文,恢复明文。

3. 数字签名

  • 签名生成:用私钥对数据哈希值加密,生成签名。
  • 签名验证:用公钥验证签名的合法性,确认数据完整性和来源可信性。

三、PHP中的非对称加密实现

1. RSA密钥生成

1
2
3
4
5
6
7
8
9
<?php
// 生成RSA密钥对(2048位)
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. 应用场景

  1. SSL/TLS通信:浏览器与服务器通过非对称加密交换对称密钥。
  2. SSH密钥认证:替代密码登录,提升服务器安全性。
  3. 数字证书(如SSL证书、代码签名证书):绑定公钥到实体身份。
  4. JWT签名:使用私钥签名令牌,客户端用公钥验证。

五、安全注意事项

  1. 防止中间人攻击:首次交换公钥时需通过可信渠道(如HTTPS证书)。
  2. 填充攻击防护:禁用不安全的填充模式(如PKCS#1 v1.5),改用OAEP填充。
  3. 密钥泄露应急:立即吊销受影响证书并生成新密钥对。

六、总结

非对称加密是现代密码学的基石,广泛应用于安全通信、身份认证等领域。PHP开发者可通过OpenSSL扩展实现基础功能,但在生产环境中需结合证书权威(CA)安全密钥存储方案构建完整的安全体系。


文章作者: Crazy Boy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Crazy Boy !
评 论
 上一篇
对称加密:一把钥匙开一把锁
对称加密:一把钥匙开一把锁
今天,咱们来聊聊对称加密,这可是密码学里的“老大哥”,至今仍然在保护着我们的大量数据。 对称加密,顾名思义,就是加密和解密用的是同一把钥匙。就像你家大门,用同一把钥匙锁门和开门。这种加密方式的特点是速度快,效率高,适合加密大量数据。 对称加
2024-03-18
下一篇 
非对称加密:两把钥匙,各司其职
非对称加密:两把钥匙,各司其职
今天,咱们来聊聊非对称加密,这可是密码学里的“黑科技”,它用两把钥匙,一把公开,一把私藏,就像你的保险箱,一把钥匙给别人放东西,一把钥匙你自己开箱。 非对称加密,也叫公钥密码学,它的特点是加密和解密用的是不同的密钥。就像你有一把公开的“邮箱
2024-03-18
  目录
  目录
hexo