Menu

Showing posts with label private key. Show all posts
Showing posts with label private key. Show all posts

Monday, April 20, 2020

[PHP - Laravel] วิธีการตรวจสอบว่า Private key ที่ผู้ใช้งานใส่เข้ามาตรงกับ Public key ที่ตั้งค่าไว้หรือไม่
[PHP - Laravel] How to Verify Private Key with Existing Public Key

สืบเนื่องจากโพสต์ [Laravel - Model] การเข้ารหัสและถอดรหัสค่าของฟิลด์ใน Laravel Model โดยใช้ SSH Keys ที่ใช้ SSH keys ในการเข้ารหัสข้อมูล โดยที่เราตั้งค่า public key ไว้ในไฟล์ .env แต่เราให้ผู้ใช้งานเป็นผู้กรอก private key เอง แล้วเราจะรู้ได้อย่างไรว่า private key ที่ถูกกรอกเข้ามานั้น เป็นคู่ของ public key ที่เราตั้งค่าไว้จริงๆ

เรามีวิธีตรวจสอบ 2 วิธีดังนี้
  • การตรวจสอบด้วยการ sign และ verify signature
  • การตรวจสอบด้วยการ encrypt และ decrypt ข้อความ

การตรวจสอบด้วยการ sign และ verify signature

ขั้นตอนการตรวจสอบเป็นดังนี้
  1. เลือกข้อความมา 1 ข้อความ ข้อความอะไรก็ได้
  2. sign ข้อความนั้นด้วย private key ที่ผู้ใช้กรอกเข้ามา เพื่อสร้าง signature
  3. verify ข้อความนั้นกับ signature ที่เพิ่ง sign ด้วย public key ในระบบ
  4. ถ้า verify ไม่ผ่านจะเกิด exception ดังนี้

Wednesday, April 15, 2020

[GIT] การตั้งค่า Deploy Key ใน Gitlab
[GIT] How to Set Up Deploy Key in Gitlab

การตั้งค่า deploy key เป็นการตั้งค่า SSH key เฉพาะโปรเจคและใช้เป็น key สำหรับการ deploy เท่านั้น โดยปกติแล้ว key นี้จะอนุญาตให้ clone หรือ pull code จาก repository เท่านั้น ไม่อนุญาตให้ทำการ push code ที่แก้ไขขึ้นมายัง repository

สมมติว่า เราสร้าง SSH key ในเครื่อง server ของเราเรียบร้อยแล้ว (ข้อมูลเพิ่มเติม: การสร้าง SSH Key ใหม่)
  1. Login เข้า Gitlab
  2. เข้าไปที่โปรเจคของเรา
  3. เลือกเมนู Settings
  4. เลือกเมนู CI/CD
  5. เลื่อนลงไปยังส่วนของ Deploy Keys แล้วกดปุ่ม Expand
  6. กรอกข้อมูล Title เพื่อระบุว่า key นี้เป็นของเครื่องใด
  7. คัดลอกข้อมูลภายใน Public key ของ SSH แล้ววางลงในช่อง Key
  8. ไม่ต้องเลือกช่อง Write access allowed
  9. กดปุ่ม Add key
เพียงเท่านี้ เราก็สามารถใช้ Clone with SSH และ pull code จาก Gitlab ด้วย SSH key ของ server เราได้แล้ว โดยไม่จำเป็นต้องใส่ username และ password

Tuesday, March 10, 2020

[Security] วิธีการแก้ไขข้อผิดพลาด "Couldn't load this key (OpenSSH-SSH-2 private key (old PEM format))" ใน TortoiseGit สำหรับ Windows
[Security] How to Fix Error "Couldn't load this key (OpenSSH-SSH-2 private key (old PEM format))" in TortoiseGit for Windows

เมื่อสร้าง SSH2 RSA key ด้วย ssh-keygen เราจะได้ไฟล์ id_rsa และ id_rsa.pub

หลังจากที่เราเอา id_rsa.pub ไปตั้งค่าบน Git Repository แล้ว เราต้องใช้ไฟล์ id_rsa ใน TortoiseGit สำหรับ Windows เพื่อ clone code จาก Git Repository ลงมายังเครื่อง ดังรูปข้างล่างนี้

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 เพื่อใช้ถอดรหัสข้อมูล

Wednesday, January 15, 2020

[Security] วิธีการดูข้อมูลใน ไฟล์ PFX บน Windows
[Security] How to View Content of PFX File on Windows

ไฟล์ PFX เป็นไฟล์ที่ใช้เก็บ certificates ทั้งหมดรวมถึง private key ที่เกี่ยวข้องด้วย ซึ่งไฟล์นี้จะมีการป้องกันด้วยรหัสผ่าน ในกรณีนี้เราใช้ไฟล์นี้ในการทำ Digital Signature

สำหรับวิธีดูข้อมูลในไฟล์ PFX สามารถรันคำสั่งใดคำสั่งหนึ่งข้างล่างนี้

  1. รันคำสั่งนี้ใน command prompt
  2. certutil -dump <path_to_cert>
    

  3. รันคำสั่งนี้ใน Windows PowerShell
  4. Get-PfxCertificate -FilePath <path_to_cert>
    

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

[Security] การสร้าง Private Key และ Public Key ด้วย OpenSSL
[Security] How to Create Private Key and Public Key with OpenSSL


สมมติว่า ได้ติดตั้ง OpenSSL ไว้ภายในเครื่องแล้ว และเราต้องการสร้าง Private key ชื่อ key.pem และ Public key ชื่อ pub.pem

วิธีการสร้าง Private key และ Public key เป็นดังนี้
  1. สร้าง Private key โดยรันคำสั่งดังนี้
  2. openssl genrsa -out key.pem 1024
    
  3. เรียกดูข้อมูล Private key ที่ถูกสร้างขึ้นด้วยคำสั่งดังนี้
  4. openssl rsa -in key.pem -text -noout
    
  5. สร้าง Public key จาก Private key ที่เพิ่งสร้าง โดยรันคำสั่งดังนี้
  6. openssl rsa -in key.pem -pubout -out pub.pem
    
  7. เรียกดูข้อมูล Public key ที่ถูกสร้างขึ้นด้วยคำสั่งดังนี้
  8. openssl rsa -in pub.pem -pubin -text -noout