ServBayでSodium PHP拡張を使う方法
ServBayは高機能なローカルWeb開発統合環境として、Sodium PHP拡張を標準搭載&デフォルト有効化しています。Sodiumは、モダンで使いやすい暗号化ライブラリであり、データ暗号化や安全な通信などに広く採用されています。ServBayなら追加のコンパイルや設定作業は不要で、PHPアプリケーションで暗号化・復号機能を簡単に利用でき、データの安全性を確保できます。
Sodium拡張とは
Sodium(libsodium)は、シンプルかつセキュアな暗号化機能を目的に設計された、現代的な暗号化ライブラリです。対称暗号、非対称暗号、デジタル署名、ハッシュ計算、鍵交換など多様な暗号処理をサポートしています。PHP 7.2以降、Sodiumライブラリはコア拡張としてPHPに標準搭載されており、廃止されたmcryptのモダンかつ安全な後継ライブラリです。
主な特長
- 簡単な利用方法:シンプルなAPIでデータの暗号化・復号処理を容易に実装できる。
- 高いセキュリティ:最新の暗号化アルゴリズムやベストプラクティスを採用し、安全性を確保。
- 多機能:対称暗号・非対称暗号・署名・ハッシュ・鍵交換など多様な用途に対応。
- クロスプラットフォーム:複数のOSや言語から利用可能。
- 高パフォーマンス:暗号・復号の高速性にも優れ、パフォーマンス要件の高い用途にも最適。
Sodiumはmcryptの後継
かつてPHPではmcryptライブラリが広く使われていましたが、メンテナンス終了やセキュリティリスクによりPHP 7.1で廃止、7.2で削除されました。Sodiumは、その現代的かつ安全な後継として導入されたものです。Sodiumはセキュリティ、使いやすさ、パフォーマンスの全てにおいて優れており、今後の新規開発プロジェクトではSodiumでの実装を強く推奨します。
ServBayにおけるSodiumの利用と有効化状況
ServBayはPHP 7.2以降のバージョンで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 = 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
サンプルコード(デジタル署名)
デジタル署名は、メッセージの完全性と送信者の真正性検証に用います。署名には秘密鍵、検証には公開鍵を使います。
<?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はmcryptに代わる現代的な暗号化手段であり、安全で信頼性の高いWebアプリ構築の鍵です。ServBayは開発者の高効率かつ安全なローカル開発環境構築をサポートします。