วิธีใช้ส่วนขยาย Sodium PHP ใน ServBay
ServBay เป็นเครื่องมือรวมสภาพแวดล้อมการพัฒนาเว็บบนเครื่องที่ทรงพลัง ซึ่งติดตั้งและเปิดใช้งานส่วนขยาย Sodium PHP มาให้โดยอัตโนมัติ Sodium เป็นไลบรารีเข้ารหัสสมัยใหม่ที่ใช้งานง่าย นิยมใช้ในการเข้ารหัสข้อมูลและการสื่อสารที่ปลอดภัย ด้วย ServBay นักพัฒนาสามารถใช้ส่วนขยาย Sodium ในแอป PHP เพื่อเข้ารหัสและถอดรหัสข้อมูลได้อย่างง่ายดาย โดยไม่ต้องคอมไพล์หรือกำหนดค่าด้วยตนเอง ช่วยให้ข้อมูลของแอปมีความปลอดภัยสูงขึ้น
รู้จัก Sodium Extension
Sodium (libsodium) คือไลบรารีเข้ารหัสข้อมูลยุคใหม่ที่ออกแบบมาให้ใช้งานง่ายและมีความปลอดภัยสูง รองรับอัลกอริทึมหลากหลาย เช่น การเข้ารหัสแบบสมมาตร, อสมมาตร, ลายเซ็นดิจิทัล, การแฮช, การแลกเปลี่ยนคีย์ เป็นต้น ตั้งแต่ PHP 7.2 เป็นต้นมา Sodium ได้ถูกรวมเป็นส่วนหนึ่งของ php core โดยเป็นทางเลือกใหม่ที่ปลอดภัยและทันสมัยกว่าของไลบรารี mcrypt ที่ยกเลิกไปแล้ว
จุดเด่นหลัก
- ใช้งานง่าย: มี API ที่เข้าใจง่าย เหมาะกับนักพัฒนาในการเข้ารหัสและถอดรหัสข้อมูล
- ปลอดภัยสูง: ใช้อัลกอริทึมเข้ารหัสสมัยใหม่และแนวทางปฏิบัติที่ดีที่สุดเพื่อความปลอดภัยสูงสุดของข้อมูล
- ฟีเจอร์ครบครัน: รองรับการเข้ารหัสแบบสมมาตร, อสมมาตร, ลายเซ็นดิจิทัล, การแฮช, การแลกเปลี่ยนคีย์ ฯลฯ
- ข้ามแพลตฟอร์ม: สามารถใช้งานได้บนระบบปฏิบัติการและภาษาโปรแกรมหลากหลาย
- ประสิทธิภาพสูง: ดำเนินการเข้ารหัสและถอดรหัสอย่างรวดเร็ว ตอบโจทย์งานที่ต้องการสมรรถนะสูง
Sodium กับการเป็นทางเลือกแทน mcrypt
ก่อนหน้านี้ mcrypt เป็นไลบรารีเข้ารหัสยอดนิยมใน PHP แต่เพราะขาดการดูแลและมีช่องโหว่ด้านความปลอดภัยจึงถูกหยุดพัฒนาใน PHP 7.1 และถูกถอดออกใน PHP 7.2 Sodium จึงถูกดึงมาเป็นตัวเลือกใหม่ที่ปลอดภัย ใช้ง่าย และมีสมรรถนะแรงกว่าอย่างชัดเจน ในการพัฒนาโปรเจกต์ PHP ใหม่ ๆ ขอแนะนำให้เปลี่ยนมาใช้ Sodium เพื่อการเข้ารหัสและถอดรหัสข้อมูลแทน mcrypt
การใช้งานและเปิดใช้ Sodium ใน ServBay
ServBay ได้เตรียมและเปิดใช้ Sodium extension ไว้ล่วงหน้าสำหรับ PHP 7.2 ขึ้นไป คุณไม่ต้องติดตั้งหรือกำหนดค่าใด ๆ เพิ่มเติม — เพียงแค่เปิด ServBay และใช้ PHP version ที่ต้องการ ก็สามารถใช้งานฟังก์ชัน Sodium ในโค้ดของคุณได้ทันที
หากต้องการตรวจสอบว่า Sodium เปิดอยู่หรือไม่ ให้ใช้ฟีเจอร์ phpinfo() ใน ServBay โดยเลือก PHP เวอร์ชันที่ใช้ แล้วไปที่ตัวเลือก phpinfo()
จากนั้นค้นหาคำว่า 'sodium' บนหน้าแสดงผล คุณจะเห็นข้อมูลโมดูลของ Sodium แสดงอยู่
การใช้งาน Sodium Extension ในโค้ด PHP
เมื่อแน่ใจว่าได้เปิด Sodium extension แล้ว คุณสามารถเรียกใช้ฟังก์ชันของมันในโปรเจกต์ PHP ได้ทันที จัดเก็บไฟล์โค้ด PHP ในโฟลเดอร์เว็บไซต์ของ ServBay (โดยดีฟอลต์คือ /Applications/ServBay/www
ภายใต้โฟลเดอร์ของแต่ละเว็บไซต์) แล้วเข้าถึงด้วยเบราว์เซอร์เพื่อทดสอบการทำงาน ตัวอย่างโค้ดเบื้องต้นมีดังนี้
ตัวอย่างโค้ด (การเข้ารหัสแบบสมมาตร)
การเข้ารหัสสมมาตรจะใช้คีย์เดียวกันสำหรับการเข้ารหัสและถอดรหัส
php
<?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 คู่กับ ciphertext
echo "ข้อความที่เข้ารหัส (Base64): " . base64_encode($ciphertext) . "\n\n";
// --- ขั้นตอนการถอดรหัส ---
// สมมติว่ามี ciphertext, 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);
}
?>
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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
ตัวอย่างโค้ด (การเข้ารหัสแบบอสมมาตร)
การเข้ารหัสอสมมาตรจะใช้คู่คีย์ (public key และ private key) โดย public key สำหรับเข้ารหัส และ private key สำหรับถอดรหัส
php
<?php
// ข้อความที่ต้องการเข้ารหัส
$message = "This is another secret message for servbay-demo user";
// สร้างคู่คีย์ (public key สำหรับเข้ารหัส, private key สำหรับถอดรหัส)
$keypair = sodium_crypto_box_keypair();
$publicKey = sodium_crypto_box_publickey($keypair); // สำหรับเผยแพร่ให้คู่สนทนา
$secretKey = sodium_crypto_box_secretkey($keypair); // เก็บเป็นความลับ ห้ามเปิดเผย
echo "Public Key (Base64): " . base64_encode($publicKey) . "\n";
echo "Private Key (Base64): [private key ไม่ควรเปิดเผยหรือแสดงผล]\n\n";
// --- ขั้นตอนการเข้ารหัส (ใช้ public key ของผู้รับ) ---
// สมมติผู้ส่งมี $publicKey ของผู้รับ
// สร้าง nonce สุ่ม ต้องใช้ค่าเดียวกันในตอนเข้ารหัสและถอดรหัส
$nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
// ใช้ public key ของผู้รับและ private key ของผู้ส่ง (ในความเป็นจริงควรเป็น private key ของผู้ส่ง + public key ของผู้รับ)
// ด้วย sodium_crypto_box ใช้ Diffie-Hellman บน Curve25519 โดยต้องใช้ public/private key ของทั้งสองฝ่าย
// เพื่อให้ง่าย ตัวอย่างนี้สมมติเป็นคีย์ของผู้ใช้คนเดียวกัน (ส่งถึง-ถอดรหัสเอง)
$ciphertext = sodium_crypto_box($message, $nonce, $keypair);
echo "ข้อความต้นฉบับ: " . $message . "\n";
echo "Nonce (Base64): " . base64_encode($nonce) . "\n"; // ต้องจัดเก็บ/ส่ง nonce คู่กับ ciphertext
echo "ข้อความที่เข้ารหัส (Base64): " . base64_encode($ciphertext) . "\n\n";
// --- ขั้นตอนถอดรหัส (ใช้ private key ของผู้รับ) ---
// สมมติผู้รับมี ciphertext, nonce, private key ($secretKey) และ public key ของผู้ส่ง ($publicKey)
// ตัวอย่างนี้ใช้ $keypair เดียวกันสำหรับถอดรหัส
$retrieved_ciphertext = $ciphertext;
$retrieved_nonce = $nonce;
$retrieved_keypair = $keypair; // ใช้คู่คีย์เดียวกันที่มี private key
// ถอดรหัสด้วย keypair
$decrypted = sodium_crypto_box_open($retrieved_ciphertext, $retrieved_nonce, $retrieved_keypair);
// ตรวจสอบผลลัพธ์
if ($decrypted === false) {
echo "ถอดรหัสไม่สำเร็จ!\n";
} else {
echo "ข้อความที่ถอดรหัสแล้ว: " . $decrypted . "\n";
}
// ล้างข้อมูลสำคัญในหน่วยความจำ
sodium_memzero($secretKey); // ล้าง private key
sodium_memzero($keypair); // ล้างคู่คีย์
if ($decrypted !== false) {
sodium_memzero($decrypted);
}
?>
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
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
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
ตัวอย่างโค้ด (การสร้างลายเซ็นดิจิทัล)
ลายเซ็นดิจิทัลใช้สำหรับตรวจสอบความถูกต้องและแหล่งที่มาของข้อความ เซ็นด้วย private key และตรวจสอบด้วย public key
php
<?php
// ข้อความที่ต้องการเซ็น
$message = "This message needs to be signed by servbay.demo";
// สร้างคู่คีย์สำหรับเซ็น (private key สำหรับเซ็น, public key สำหรับตรวจสอบ)
$keypair = sodium_crypto_sign_keypair();
$publicKey = sodium_crypto_sign_publickey($keypair); // สำหรับฝ่ายตรวจสอบรับไว้
$secretKey = sodium_crypto_sign_secretkey($keypair); // ต้องเก็บเป็นความลับ
echo "Public Key (Base64): " . base64_encode($publicKey) . "\n";
echo "Private Key (Base64): [private key ไม่ควรเปิดเผยหรือแสดงผล]\n\n";
// --- ขั้นตอนการเซ็น (ใช้ private key ของผู้ส่ง) ---
$signature = sodium_crypto_sign_detached($message, $secretKey);
echo "ข้อความต้นฉบับ: " . $message . "\n";
echo "ลายเซ็น (Base64): " . base64_encode($signature) . "\n\n";
// --- ขั้นตอนตรวจสอบลายเซ็น (ใช้ public key ของผู้ส่ง) ---
// สมมติฝ่ายตรวจสอบมีข้อความ, ลายเซ็น และ public key ของผู้เซ็น ($publicKey)
$retrieved_message = $message;
$retrieved_signature = $signature;
$retrieved_publicKey = $publicKey;
// ตรวจสอบลายเซ็นโดยใช้ public key
if (sodium_crypto_sign_verify_detached($retrieved_signature, $retrieved_message, $retrieved_publicKey)) {
echo "ลายเซ็นถูกต้อง! ข้อความไม่ถูกแก้ไขและมาจากเจ้าของ private key จริง\n";
} else {
echo "ลายเซ็นไม่ถูกต้อง! อาจมีการแก้ไขหรือไม่ได้เซ็นมาจาก private key ที่ตรงกัน\n";
}
// ล้างข้อมูลสำคัญในหน่วยความจำ
sodium_memzero($secretKey); // ล้าง private key
sodium_memzero($keypair); // ล้างคู่คีย์
?>
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
26
27
28
29
30
31
32
33
34
35
36
37
38
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 ในการสร้างเว็บแอปพลิเคชันที่เชื่อถือได้ ServBay จึงช่วยให้การพัฒนาสภาพแวดล้อมโลคอลที่มีประสิทธิภาพและปลอดภัยเป็นเรื่องง่ายยิ่งขึ้น