เรามีวิธีตรวจสอบ 2 วิธีดังนี้
- การตรวจสอบด้วยการ sign และ verify signature
- การตรวจสอบด้วยการ encrypt และ decrypt ข้อความ
การตรวจสอบด้วยการ sign และ verify signature
ขั้นตอนการตรวจสอบเป็นดังนี้- เลือกข้อความมา 1 ข้อความ ข้อความอะไรก็ได้
- sign ข้อความนั้นด้วย private key ที่ผู้ใช้กรอกเข้ามา เพื่อสร้าง signature
- verify ข้อความนั้นกับ signature ที่เพิ่ง sign ด้วย public key ในระบบ
- ถ้า verify ไม่ผ่านจะเกิด exception ดังนี้
โค้ดตัวอย่างที่ implement ตามขั้นตอนข้างบนเป็นดังนี้
use phpseclib\Crypt\RSA;
use Cache;
...
$privateKey = "key_from_user";
$publicKey = env('PUBLIC_KEY');
$plaintext = 'ThisIsTest';
$rsa = new RSA();
$rsa->loadKey($privateKey);
$signature = $rsa->sign($plaintext);
$rsa->loadKey($publicKey);
try {
$isVerified = $rsa->verify($plaintext, $signature);
if(!$isVerified) {
throw new \Exception('Incorrect SSH key')
}
Cache::forever('private_key', $privateKey);
} catch (\Exception $ex) {
// Handle invalid signature
}
...
หมายเหตุ การตรวจสอบด้วยวิธีนี้อาจจะเกิด exception ข้างล่างนี้ในบางครั้ง เนื่องจาก signature ที่ได้อาจมีขนาดใหญ่กว่าที่กำหนดขั้นตอนการตรวจสอบเป็นดังนี้
โค้ดตัวอย่างที่ implement ตามขั้นตอนข้างบนเป็นดังนี้- เลือกข้อความมา 1 ข้อความ ข้อความอะไรก็ได้
- encrypt ข้อความนั้นด้วย public key ในระบบ
- decrypt ข้อความที่ได้จากข้อ 2 ด้วย private key ที่ผู้ใช้กรอกเข้ามา
- ถ้า decrypt ข้อความไม่สำเร็จ จะได้ค่า false
use phpseclib\Crypt\RSA;
use Cache;
...
$privateKey = "key_from_user";
$publicKey = env('PUBLIC_KEY');
$plaintext = 'ThisIsTest';
$rsa = new RSA();
$rsa->loadKey($publicKey);
$ciphertext = $rsa->encrypt($plaintext);
$rsa->loadKey($privateKey);
$decryptedText = $rsa->decrypt($ciphertext);
if($decryptedText && $plaintext == $decryptedText) {
Cache::forever('private_key', $privateKey);
}
else {
// Handle invalid signature
}
...

No comments:
Post a Comment