Menu

Showing posts with label encryption. Show all posts
Showing posts with label encryption. Show all posts

Wednesday, February 26, 2020

[Laravel - Package] การเข้ารหัสและถอดรหัสข้อความโดยใช้ SSH keys
[Laravel - Package] String Encryption and Decryption by Using SSH Keys

การเข้ารหัสและถอดรหัสข้อความโดยใช้ SSH keys ใน Laravel เราจะใช้ package ชื่อ phpseclib

สำหรับตัวอย่างการเข้ารหัสและถอดรหัสเป็นดังนี้
use phpseclib\Crypt\RSA;
...

$publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCEa1ivzN/iW1wBTyT1T6uPcDKzi3HlCBCp3ro61ZxA1byilNH/TP7HW3iFAh0A0Lyk7dZ7d6Ot4jdsXc783T+Ic0n2Blfh0kCm0ci7q2qXqOLpCa6N30LQyiDofSmaLRzQlD49kjVY8GJYrdqo7lEQvBupenJzjS71LgkIqq+BeQIDAQAB';

$privateKey = 'MIICXQIBAAKBgQCEa1ivzN/iW1wBTyT1T6uPcDKzi3HlCBCp3ro61ZxA1byilNH/TP7HW3iFAh0A0Lyk7dZ7d6Ot4jdsXc783T+Ic0n2Blfh0kCm0ci7q2qXqOLpCa6N30LQyiDofSmaLRzQlD49kjVY8GJYrdqo7lEQvBupenJzjS71LgkIqq+BeQIDAQABAoGAVfYZrIYjEJ6eK3tlUppVlNgREd0EItoJdzzPSEJDHROjUSeq60DgZCpNIossqMrYq3h6M8yGxOqFcCO1qxE1nDhwMRxNYALnM8yBfVTe/RfASD7A+XLBB4HKOPPAs7HjPj6rdJpTSLxSNFXW7lMmw+AUTuI1B5TTqINWR83rewECQQDrYAXjdB9/Xg2x+tW6kBh3Dcdm12d3bTIXklfVeds4/3tvJyZkWi/FnNAkZLG40+R39xzP2s+XbN4Ul14aok4VAkEAkAXNBC++X+91esEIwTf4RTMxn7Q/m5F9j7G827bTWUJ+oPCoCnmdLth+9QfMyVboo4D7P8w+trm665+emV7i1QJBALdBZrRFh/RxdPY6VkdPw0yGFNb0JKFuCg8iKHKT0mPZPfA3qgN92C3iPofnQhumFf51DiCiuvepkmqzw1e3QFUCQEDznMYqkfzKDX1S2RPqnfj3YYXY0Gbkcm//hGDCTwaOSnVikyZGOnEKChePcPfMThaO8MCQ6CeYE4h38BrTBBECQQDDp8w+aItksMhcLGIyPRZZmlLew6ic+Pv+8fES9apzy/13MbBpxm/oPVavftLQi+6N29eTtqbE7lL1hRcdsUqn';

$plaintext = 'test';

$rsa = new RSA();

$rsa->loadKey($publicKey);
$ciphertext = $rsa->encrypt($plaintext);

$rsa->loadKey($privateKey);
echo $rsa->decrypt($ciphertext);
สำหรับตัวอย่างการ Verify key เป็นดังนี้
$plaintext = 'ThisIsTest';

$rsa = new RSA();
$rsa->loadKey($privateKey);
$signature = $rsa->sign($plaintext);

$rsa->loadKey($publicKey);
$rsa->verify($plaintext, $signature); // Throw exception if verification is failed

Tuesday, February 25, 2020

[Laravel - Model] การเข้ารหัสและถอดรหัสค่าของฟิลด์ใน Laravel Model โดยใช้ SSH Keys
[Laravel - Model] Field Values Encryption and Decryption in Laravel Model by Using SSH Key

สืบเนื่องจากโพสต์ [Laravel - Model] การเข้ารหัสและถอดรหัสค่าของฟิลด์ใน Laravel Model ที่เราเข้ารหัสข้อมูลก่อนเก็บลงฐานข้อมูล โดยใช้การเข้ารหัสและถอดรหัสของ Laravel ซึ่งใช้ APP_KEY ใน .env เป็น key ทำให้คนที่เข้าถึง application สามารถถอดรหัสข้อมูลได้

เพื่อเพิ่มความปลอดภัยขึ้นไปอีกขั้น เราจะเปลี่ยนจากการใช้ APP_KEY ใน .env เป็น SSH Keys ซึ่งแยกเป็น Public key และ Private key แทน โดยเราจะได้เพียง Public key มาใช้ในการเข้ารหัส แต่คนมีสิทธิ์ดูข้อมูลเท่านั้นที่จะมี Private key เพื่อใช้ถอดรหัสข้อมูล

Monday, January 6, 2020

[Security] วิธีการบีบอัดไฟล์ ZIP พร้อมเข้ารหัสและถอดรหัสด้วย Public และ Private Keys
[Security] How to Create ZIP Files with Encryption and Decryption using Public and Private Key


สมมติว่า
  1. เราสร้าง Private key ชื่อ key.pem และ Public key ชื่อ pub.pem ด้วย OpenSSL แล้ว
  2. เราต้องการสร้าง ไฟล์ ZIP ชื่อ archive.7z 

วิธีการบีบอัดและเข้ารหัสไฟล์ ZIP

  1. สร้างรหัสผ่านด้วยการสุ่ม
  2. เข้ารหัสรหัสผ่านด้วย pub.pem แล้วบันทึกลงไฟล์ข้อความ archivePassword.ssl
  3. บีบอัดไฟล์ข้อความดังกล่าว archivePassword.ssl เข้าไปใน archive.7z โดยไม่กำหนดรหัสผ่าน
  4. บีบอัดแฟ้มหรือไฟล์ที่ต้องการเข้าไปเพิ่มใน archive.7z ด้วยรหัสผ่านตามข้อ 1

วิธีการถอดรหัสและแตกไฟล์ไฟล์ ZIP

  1. แตกไฟล์ข้อความ archivePassword.ssl จาก archive.7z
  2. ถอดรหัสข้อความภายใน archivePassword.ssl  ด้วย key.pem เพื่อให้ได้รหัสผ่านสำหรับแตกไฟล์
  3. แตก archive.7z ส่วนที่เหลือด้วยรหัสผ่านที่จากข้อ 2 เพื่อให้ได้แฟ้มหรือไฟล์ที่ต้องการ
สำหรับคนที่ต้องการใช้งานสคริปต์สำเร็จรูป สามารถดูได้ที่ https://github.com/arzeroid/e7z

หมายเหตุ สาเหตุที่ไม่เข้ารหัสไฟล์ ZIP ทั้งไฟล์ เพราะจะใช้เวลานานทั้งตอนเข้ารหัสและถอดรหัส จึงเข้ารหัสและถอดรหัสแค่รหัสผ่านเท่านั้น

Friday, December 6, 2019

[Security] การเข้ารหัสและถอดรหัสไฟล์โดยใช้ Public และ Private Keys
[Security] File Encryption and Decryption by Using Public and Private Keys


สมมติว่า มีไฟล์ที่เกี่ยวข้องดังนี้
  • key.pem เป็นไฟล์ Private key
  • pub.pem เป็นไฟล์ Public key
  • data.txt เป็นไฟล์ข้อความที่ต้องการเข้ารหัส
หมายเหตุ กรณีที่ยังไม่มีไฟล์ key.pem และ pub.pem อ่านวิธีสร้างได้ที่ การสร้าง Private Key และ Public Key ด้วย OpenSSL

Wednesday, November 27, 2019

[Laravel - Model] การเข้ารหัสและถอดรหัสค่าของฟิลด์ใน Laravel Model
[Laravel - Model] Field Values Encryption and Decryption in Laravel Model

ในบางกรณี เราต้องการรักษาความลับของข้อมูล โดยอนุญาตให้เฉพาะผู้ที่เกี่ยวข้องเท่านั้นที่สามารถดูและแก้ไขได้ ระบบส่วนใหญ่จึงจำกัดสิทธิ์การใช้งานของแต่ละผู้ใช้งานภายใน application

อย่างไรก็ตาม ระบบดังกล่าวยังคงเก็บข้อมูลจริงลงฐานข้อมูลโดยไม่มีการเข้ารหัสใดๆ ทำให้ Database Admin ยังสามารถเข้าดูข้อมูลและแก้ไขได้

การเข้ารหัสข้อมูลก่อนเก็บลงฐานข้อมูล จึงเป็นการเพิ่มความปลอดภัยของข้อมูลอีกขั้นนึง

สำหรับ Laravel Model ที่มี function กลางสำหรับการดึงค่าข้อมูลและเก็บข้อมูลของ Fields ต่างๆ ทำให้การเข้ารหัสและถอดรหัสนั้นทำได้ง่ายขึ้นมาก เราเพียงเขียน Trait แล้วนำไปใส่ใน Model พร้อมกับกำหนด Fields ที่เราต้องการเข้ารหัสเท่านั้น

Monday, July 17, 2017

[NodeJS] Base64 Encryption และ Decryption โดยไม่ต้องลง package เพิ่มเติม
[NodeJS] Base64 Encryption and Decryption without Requiring Additional Packages

Base64 เป็นรูปแบบการแปลงข้อมูล Binary เป็นข้อมูลแบบ String สำหรับการใช้งานที่ไม่รองรับข้อมูลแบบ Binary เช่น การส่งข้อมูลไปยัง JSON API

Encryption
let bitmap = fs.readFileSync(imgPath);
let imgBase64 = new Buffer(bitmap).toString('base64');
Decryption
let bitmap = Buffer.from(imgBase64, 'base64');