Kotchasan Framework Documentation

Kotchasan Framework Documentation

Password Class - การจัดการความปลอดภัย

TH 03 Feb 2026 16:41

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)

การทำงาน:

  1. จัดเรียง parameter ตาม key (ksort)
  2. สร้าง query string (http_build_query)
  3. เข้ารหัสด้วย HMAC-SHA256
  4. แปลงเป็นตัวพิมพ์ใหญ่

ตัวอย่าง:

$params = [
    'id' => 123,
    'timestamp' => 1630000000,
    'action' => 'update'
];
$secret = 'api_secret_key';

$sign = Password::generateSign($params, $secret);
// ใช้ตรวจสอบความถูกต้องของ request

uniqid()

สร้างรหัสสุ่ม (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);
    }
}

สร้างลิงก์สำหรับรีเซ็ตรหัสผ่านแบบปลอดภัย

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";
        }
    }
}

หมายเหตุสำคัญ

  1. Key Management: ความปลอดภัยขึ้นอยู่กับการเก็บรักษา $password หรือ $secret ห้ามเปิดเผยหรือเก็บไว้ในที่ที่เข้าถึงง่าย (เช่น public git repo)
  2. Encryption Method: คลาสนี้ใช้ AES-256-CBC ซึ่งต้องการ IV (Initialization Vector) ซึ่งถูกจัดการให้อัตโนมัติรวมอยู่ใน output
  3. Exceptions: เมธอด decode จะโยน Exception หากข้อมูลไม่ถูกต้อง ควรใช้ block try-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