เรามีวิธีตรวจสอบ 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