如何在 ServBay 中使用 Sodium PHP 扩展
ServBay 作为一款强大的本地 Web 开发集成环境,预置并默认启用了 Sodium PHP 扩展。Sodium 是一个现代、易用的加密库,广泛应用于数据加密和安全通信。借助 ServBay,开发者无需额外编译或配置,即可轻松在 PHP 应用中使用 Sodium 扩展进行数据加密和解密,确保应用的数据安全。
Sodium 扩展简介
Sodium(libsodium)是一个现代的加密库,设计目标是提供简单、易用且安全的加密功能。它支持多种加密算法和操作,例如对称加密、非对称加密、数字签名、哈希计算、密钥交换等。自 PHP 7.2 版本起,Sodium 库作为核心扩展被集成到 PHP 中,是已被废弃的 mcrypt 库的现代、更安全的替代方案。
主要特点
- 易于使用:提供简洁的 API 接口,便于开发者进行数据加密和解密。
- 高安全性:采用现代加密算法和最佳实践,确保数据安全。
- 多功能:支持对称加密、非对称加密、数字签名、哈希计算、密钥交换等多种操作。
- 跨平台:可在多种操作系统和编程语言中使用。
- 性能高效:加密和解密操作性能优越,适用于对性能有要求的应用场景。
Sodium 作为 mcrypt 的替代
mcrypt 库曾是 PHP 中广泛使用的加密库,但因不再维护且存在潜在安全漏洞,已在 PHP 7.1 中被废弃,并在 PHP 7.2 中被移除。Sodium 被引入作为其现代、安全的替代方案。Sodium 库提供了更高的安全性、易用性和更优的性能,强烈建议在新开发的项目中使用 Sodium 代替 mcrypt 进行数据加密和解密。
ServBay 中 Sodium 的可用性与启用
ServBay 为其包含的 PHP 7.2 及更高版本预编译并默认启用了 Sodium 扩展。这意味着作为 ServBay 用户,您无需手动安装或配置 Sodium。只需启动 ServBay 并运行相应的 PHP 版本,即可直接在代码中使用 Sodium 函数。
要验证 Sodium 是否已启用,您可以通过 ServBay 的 phpinfo() 功能查看。在 ServBay 界面中选择您使用的 PHP 版本,找到 phpinfo()
选项,在输出页面中搜索 'sodium',您应该能看到 Sodium 模块的信息。
在 PHP 代码中使用 Sodium 扩展
在确认 Sodium 扩展已启用后,您可以在您的 PHP 项目中使用其提供的函数。将您的 PHP 代码文件保存在 ServBay 的网站根目录(默认为 /Applications/ServBay/www
)下的相应网站子目录中,然后通过浏览器访问即可运行。以下是一些基本用例代码示例:
示例代码(对称加密)
对称加密使用同一个密钥进行加密和解密。
<?php
// 待加密的消息
$message = "This is a secret message from servbay.demo";
// 生成一个随机密钥 (密钥长度固定为 SODIUM_CRYPTO_SECRETBOX_KEYBYTES)
$key = sodium_crypto_secretbox_keygen();
// 生成一个随机 Nonce (Number used once),必须在加密和解密时使用同一个 Nonce
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
// 使用密钥和 Nonce 进行加密
$ciphertext = sodium_crypto_secretbox($message, $nonce, $key);
echo "原始消息: " . $message . "\n";
echo "Nonce (Base64): " . base64_encode($nonce) . "\n"; // Nonce 通常需要与密文一起存储或传输
echo "密文 (Base64): " . base64_encode($ciphertext) . "\n\n";
// --- 解密过程 ---
// 假设我们已经有了密文、Nonce 和密钥
$retrieved_ciphertext = $ciphertext; // 从存储或传输中获取的密文
$retrieved_nonce = $nonce; // 从存储或传输中获取的 Nonce
$retrieved_key = $key; // 从存储或传输中获取的密钥
// 使用密钥和 Nonce 进行解密
$decrypted = sodium_crypto_secretbox_open($retrieved_ciphertext, $retrieved_nonce, $retrieved_key);
// 检查解密是否成功
if ($decrypted === false) {
echo "解密失败!\n";
} else {
echo "解密后的消息: " . $decrypted . "\n";
}
// 清理敏感数据,防止内存泄露
sodium_memzero($key);
sodium_memzero($retrieved_key);
if ($decrypted !== false) {
sodium_memzero($decrypted);
}
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
示例代码(非对称加密)
非对称加密使用一对公钥和私钥。公钥用于加密,私钥用于解密。
<?php
// 待加密的消息
$message = "This is another secret message for servbay-demo user";
// 生成密钥对 (公钥用于加密,私钥用于解密)
$keypair = sodium_crypto_box_keypair();
$publicKey = sodium_crypto_box_publickey($keypair); // 公开给对方
$secretKey = sodium_crypto_box_secretkey($keypair); // 自己保留,绝不泄露
echo "公钥 (Base64): " . base64_encode($publicKey) . "\n";
echo "私钥 (Base64): [私钥敏感,不应直接显示或泄露]\n\n";
// --- 加密过程 (使用接收者的公钥) ---
// 假设发送者拥有接收者的 $publicKey
// 生成一个随机 Nonce,必须在加密和解密时使用同一个 Nonce
$nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
// 使用接收者的公钥和发送者的私钥(通常需要对方的公钥和自己的私钥进行协商,这里简化处理,直接使用生成的密钥对)
// 注意:实际应用中,这里应该是 发送者的私钥 + 接收者的公钥
// Sodium 的 crypto_box 实际上是基于 Curve25519 的 Diffie-Hellman 密钥交换,所以需要双方的公私钥
// 为了简化示例,我们假设这是同一个用户的密钥对,自己加密自己解密
$ciphertext = sodium_crypto_box($message, $nonce, $keypair); // 在这个简化例子中,使用 keypair 包含了公私钥
echo "原始消息: " . $message . "\n";
echo "Nonce (Base64): " . base64_encode($nonce) . "\n"; // Nonce 需要与密文一起存储或传输
echo "密文 (Base64): " . base64_encode($ciphertext) . "\n\n";
// --- 解密过程 (使用接收者的私钥) ---
// 假设接收者拥有密文、Nonce 和自己的私钥 ($secretKey) 以及发送者的公钥 ($publicKey)
// 在这个简化例子中,就是使用 $keypair
$retrieved_ciphertext = $ciphertext;
$retrieved_nonce = $nonce;
$retrieved_keypair = $keypair; // 使用包含私钥的 keypair 进行解密
// 使用自己的密钥对进行解密
$decrypted = sodium_crypto_box_open($retrieved_ciphertext, $retrieved_nonce, $retrieved_keypair);
// 检查解密是否成功
if ($decrypted === false) {
echo "解密失败!\n";
} else {
echo "解密后的消息: " . $decrypted . "\n";
}
// 清理敏感数据
sodium_memzero($secretKey); // 清理私钥
sodium_memzero($keypair); // 清理密钥对
if ($decrypted !== false) {
sodium_memzero($decrypted);
}
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
示例代码(数字签名)
数字签名用于验证消息的完整性和发送者的身份。使用私钥签名,使用公钥验证。
<?php
// 待签名的消息
$message = "This message needs to be signed by servbay.demo";
// 生成签名密钥对 (私钥用于签名,公钥用于验证)
$keypair = sodium_crypto_sign_keypair();
$publicKey = sodium_crypto_sign_publickey($keypair); // 公开给验证者
$secretKey = sodium_crypto_sign_secretkey($keypair); // 自己保留,绝不泄露
echo "公钥 (Base64): " . base64_encode($publicKey) . "\n";
echo "私钥 (Base64): [私钥敏感,不应直接显示或泄露]\n\n";
// --- 签名过程 (使用发送者的私钥) ---
$signature = sodium_crypto_sign_detached($message, $secretKey);
echo "原始消息: " . $message . "\n";
echo "签名 (Base64): " . base64_encode($signature) . "\n\n";
// --- 验证过程 (使用发送者的公钥) ---
// 假设验证者拥有消息、签名和发送者的公钥 ($publicKey)
$retrieved_message = $message;
$retrieved_signature = $signature;
$retrieved_publicKey = $publicKey;
// 使用公钥验证签名
if (sodium_crypto_sign_verify_detached($retrieved_signature, $retrieved_message, $retrieved_publicKey)) {
echo "签名有效!消息未被篡改,且确实来自私钥持有者。\n";
} else {
echo "签名无效!消息可能已被篡改,或签名不是由对应的私钥生成。\n";
}
// 清理敏感数据
sodium_memzero($secretKey); // 清理私钥
sodium_memzero($keypair); // 清理密钥对
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
总结
通过 ServBay,开发者可以便捷地使用预装并默认启用的 Sodium PHP 扩展。这消除了在本地环境中安装和配置 Sodium 的复杂性,使您能够专注于利用 Sodium 强大的加密功能提升应用的安全性。Sodium 作为 mcrypt 的现代替代品,是构建安全可靠 Web 应用的关键工具。ServBay 简化了这一过程,助力开发者构建高效、安全的本地开发环境。