Kotchasan Framework Documentation
Password Class - การจัดการความปลอดภัย
Password Class - การจัดการความปลอดภัย
คลาส Password ให้บริการฟังก์ชันเกี่ยวกับการเข้ารหัส (Encryption), การถอดรหัส (Decryption), การสร้างลายเซ็นอิเล็กทรอนิกส์ (Signature), และการสร้างรหัสสุ่ม (Unique ID)
Namespace
Kotchasan\Passwordความปลอดภัย
- ใช้การเข้ารหัสแบบ AES-256-CBC สำหรับ
encode/decode - ใช้ HMAC-SHA256 สำหรับ
generateSign - ใช้ OpenSSL หรือ random_bytes สำหรับการสร้างรหัสสุ่ม
Public Methods (4 methods)
encode()
เข้ารหัสข้อความ (Encrypt)
public static function encode(string $string, string $password): stringพารามิเตอร์:
$string- ข้อความที่ต้องการเข้ารหัส$password- กุญแจเข้ารหัส (Password/Key)
คืนค่า: String ที่เข้ารหัสแล้ว (Base64 encoded)
ตัวอย่าง:
use Kotchasan\Password;
$secret = 'MySecretMessage';
$key = 'my-secret-key';
$encrypted = Password::encode($secret, $key);
// ผลลัพธ์: string ที่เข้ารหัส (เช่น "U2FsdGVkX1...")decode()
ถอดรหัสข้อความ (Decrypt)
public static function decode(string $string, string $password): stringพารามิเตอร์:
$string- ข้อความที่ถูกเข้ารหัส (จากencode())$password- กุญแจที่ใช้เข้ารหัส
คืนค่า: ข้อความต้นฉบับ
Exceptions:
Exception- ถ้าถอดรหัสไม่สำเร็จหรือข้อมูลไม่ถูกต้อง
ตัวอย่าง:
try {
$decrypted = Password::decode($encrypted, $key);
echo $decrypted; // "MySecretMessage"
} catch (\Exception $e) {
echo "Decryption failed: " . $e->getMessage();
}generateSign()
สร้าง Signature สำหรับ API Authentication
public static function generateSign(array $params, string $secret): stringพารามิเตอร์:
$params- Array ของพารามิเตอร์$secret- Secret Key
คืนค่า: Signature string (Uppercase SHA-256 HMAC)
การทำงาน:
- จัดเรียง parameter ตาม key (
ksort) - สร้าง query string (
http_build_query) - เข้ารหัสด้วย HMAC-SHA256
- แปลงเป็นตัวพิมพ์ใหญ่
ตัวอย่าง:
$params = [
'id' => 123,
'timestamp' => 1630000000,
'action' => 'update'
];
$secret = 'api_secret_key';
$sign = Password::generateSign($params, $secret);
// ใช้ตรวจสอบความถูกต้องของ requestuniqid()
สร้างรหัสสุ่ม (Random String)
public static function uniqid(int $length = 13): stringพารามิเตอร์:
$length- ความยาวที่ต้องการ (ค่าเริ่มต้น 13)
คืนค่า: String สุ่ม (Hexadecimal)
ตัวอย่าง:
// สร้าง Token 13 ตัวอักษร
$token = Password::uniqid();
// สร้าง ID 32 ตัวอักษร
$id = Password::uniqid(32);ตัวอย่างการใช้งานแบบสมบูรณ์
1. Secure Data Storage
การเก็บข้อมูลความลับลงฐานข้อมูลโดยการเข้ารหัส
use Kotchasan\Password;
class SecureStorage
{
private $key = 'app-secret-key-123';
public function saveSensitiveData($userId, $data)
{
// เข้ารหัสก่อนบันทึก
$encrypted = Password::encode($data, $this->key);
// บันทึกลงฐานข้อมูล
$db->insert('user_secrets', [
'user_id' => $userId,
'data' => $encrypted
]);
}
public function getSensitiveData($userId)
{
$record = $db->find($userId);
try {
// ถอดรหัสเพื่อนำมาใช้งาน
return Password::decode($record->data, $this->key);
} catch (\Exception $e) {
return null;
}
}
}2. API Authentication
การตรวจสอบ API Request ด้วย Signature
use Kotchasan\Password;
class ApiController
{
private $apiSecret = 'my-api-secret';
public function handleRequest($requestParams)
{
// แยก signature ที่ส่งมา
$clientSign = $requestParams['sign'];
unset($requestParams['sign']);
// สร้าง signature เพื่อตรวจสอบ
$serverSign = Password::generateSign($requestParams, $this->apiSecret);
if ($clientSign !== $serverSign) {
throw new \Exception('Invalid Signature');
}
// Signature ถูกต้อง - ทำงานต่อ
return "Success";
}
}3. Token Generation
การสร้าง CSRF Token หรือ Session ID
use Kotchasan\Password;
class TokenManager
{
public static function createCsrfToken()
{
if (empty($_SESSION['csrf_token'])) {
// สร้าง token 32 ตัวอักษร
$_SESSION['csrf_token'] = Password::uniqid(32);
}
return $_SESSION['csrf_token'];
}
public static function verifyCsrfToken($token)
{
return isset($_SESSION['csrf_token']) &&
hash_equals($_SESSION['csrf_token'], $token);
}
}4. Password Reset Link
สร้างลิงก์สำหรับรีเซ็ตรหัสผ่านแบบปลอดภัย
use Kotchasan\Password;
class ResetPassword
{
private $appKey = 'secure-app-key';
public function createLink($email)
{
// รวมข้อมูลและ timestamp
$data = json_encode([
'email' => $email,
'expire' => time() + 3600 // 1 ชั่วโมง
]);
// เข้ารหัส
$token = Password::encode($data, $this->appKey);
// สร้าง URL (ต้อง urlencode เพราะ base64 มี +/=)
return "https://site.com/reset?token=" . urlencode($token);
}
public function verifyToken($token)
{
try {
$json = Password::decode($token, $this->appKey);
$data = json_decode($json);
if ($data->expire < time()) {
return "Token expired";
}
return $data->email; // Valid
} catch (\Exception $e) {
return "Invalid token";
}
}
}หมายเหตุสำคัญ
- Key Management: ความปลอดภัยขึ้นอยู่กับการเก็บรักษา
$passwordหรือ$secretห้ามเปิดเผยหรือเก็บไว้ในที่ที่เข้าถึงง่าย (เช่น public git repo) - Encryption Method: คลาสนี้ใช้ AES-256-CBC ซึ่งต้องการ IV (Initialization Vector) ซึ่งถูกจัดการให้อัตโนมัติรวมอยู่ใน output
- Exceptions: เมธอด
decodeจะโยน Exception หากข้อมูลไม่ถูกต้อง ควรใช้ blocktry-catchเสมอ
สรุป
คลาส Password เป็นเครื่องมือที่จำเป็นสำหรับความปลอดภัย:
- ✅ Encryption: AES-256-CBC (ปลอดภัยสูง)
- ✅ API Security: HMAC Signature
- ✅ Randomness: Cryptographically secure random bytes
- 🔒 Integrity: มีการตรวจสอบความถูกต้องของข้อมูล
เหมาะสำหรับ:
- เข้ารหัสข้อมูลส่วนตัว
- API Authentication
- Token Generation
- Secure Links
ไฟล์ขนาด: 93 บรรทัด
Public Methods: 4 methods
Pattern: Static utility class