หลายๆ ครั้งที่ข้อมูลที่มีความสำคัญ เช่น ชื่อ นามสกุล หมายเลขบัตรประชาชน หรือแม้แต่หมายเลขบัตรเครดิต หากทำให้เกิดความปลอดภัยมากขึ้นเราควรเข้ารหัสข้อมูลเหล่านี้ในฐานข้อมูลด้วยเช่นกัน ซึ่งปกติแล้ว หลายๆ Database ก็มีความสามารถเช่นกัน เช่น MySQL, MariaDB ที่มี AES_encrypt/AES_decrypt เป็นต้น
อีกส่วนหนึ่งเราสามารถใช้คุณสมบัติของ Yii2 ได้โดยใช้ security component ซึ่งมี method ให้เรียกใช้ เช่น encryptByPassword(), encryptByKey() เป็นต้น ดูรายละเอียดเพิ่มเติมได้ที่ https://www.yiiframework.com/doc/api/2.0/yii-base-security
ในที่นี้เราจะใช้ method beforeSave() ในการเข้ารหัสข้อมูล และ method afterFind() ในการถอดรหัสข้อมูล ซึ่งเป็น method ใน Model โดยการเพิ่มเข้าไปลักษณะนี้
/**
* @param bool $insert
* @return bool
*/
public function beforeSave($insert)
{
$this->setAttribute('name', base64_encode(Yii::$app->security->encryptByKey($this->name, '123abc')));
return parent::beforeSave($insert);
}
/**
*
*/
public function afterFind()
{
$this->setAttribute('name', Yii::$app->security->decryptByKey(base64_decode($this->name), '123abc'));
}
จาก code ด้านบน เราจะเห็นว่ามีการเข้ารหัส 2 ชั้น เนื่องจาก Yii2 การเข้ารหัสจาก encryptByKey() นั้นจะทำให้ได้อักขระที่ไม่ unicode ดังนั้นเราก็เลยใช้ base64_encode() อีกรอบแล้วค่อยบันทึกลง database โดยที่ 123abc คือ key ของเรา (สามารถ generate ได้จาก Yii::$app->security->generateRandomKey()) name คือ attribute ที่เราต้องการ encrypt/decrypt
เพียงเท่านี้เราก็สามารถใช้งานการเข้ารหัสข้อมูลได้แล้ว
หมายเหตุ ยังไม่สามารถใช้กับการ search ได้
ความคิดเห็น