如何在 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 作為其現代、安全替代方案被納入 PHP。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(僅用一次的數值),加密與解密時需使用同一組 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 讓這一切變得更單純,協助開發者建立高效且安全的本地開發環境。