在開發商業網站的時候,對資料加密是必要的手段,尤其是資料庫中關於會員隱私,或是商業機密的部份都要特別處理。
在實務上通常不會用資料庫內建的加密功能,而是用後端語言來實現 encrypt 與 decrypt,資料庫只儲存加密後的訊息。
在 Laravel 裡加解密可以透過繼承 Eloquent,用 magic function 來達成自動化。
class BaseModel extends Eloquent { protected $encrypt = []; public function setAttribute($key, $value) { if (in_array($key, $this->encrypt)) { $value = Crypt::encrypt($value); } return parent::setAttribute($key, $value); } public function getAttribute($key) { if (in_array($key, $this->encrypt)) { return Crypt::decrypt($this->attributes[$key]); } return parent::getAttribute($key); } public function attributesToArray() { $attributes = parent::attributesToArray(); foreach ($attributes as $key => $value) { if (in_array($key, $this->encrypt)) { $attributes[$key] = Crypt::decrypt($value); } } return $attributes; }
而需要用到加解密的 Model 改繼承 BaseModel,並將需要加密的欄位寫在 $encrypt 陣列中即可。
需要搜尋加密欄位的時候,可以參考以下作法…
$match = User::all()->filter(function($record) use($email) { $field = $record->email['email']; if(Crypt::decrypt($field) == $email) return $record; });
這個作法會 scan table,效率應該會很糟。但 Laravel 預設的加密方式會自動加鹽,相同的明文配相同的金鑰也會產出不一樣的密文,暫時只想到這種解決。
for($i = 1; $i先醬,想到再補充。
Leave a Reply Cancel reply