我在我的模型中beforeSave和一个afterFind功能。该函数加密和解密成功的字符串:
public function beforeSave($options = array()) {
foreach($this->encryptedFields as $fieldName){
if(!empty($this->data[$this->alias][$fieldName])){
$this->data[$this->alias][$fieldName] = Security::rijndael($this->data[$this->alias][$fieldName], Configure::read('Security.key'), 'encrypt');
}
}
return true;
}
但。如果我这样做
$mobileno = 1234
$mobile = Security::rijndael($mobileNo, Configure::read('Security.key'), 'encrypt');
然后我就例如像运行查询:
select * from table where mobileno = $mobileno;
我不能得到的结果。因为现在这是我加密上述mobileno
是从加密移动电话号码是在分贝不同。
这是因为Security::rijndael()
使用在每次调用随机initialization vector。
为了解决这个,你将不得不使用一个固定的IV,但是这会降低安全性,所以这不是一个好主意!
对于这种情况,我通常另一个字段添加到未加密的值存储在一个HMAC hash形式的表(不是常规的哈希!还应该使用比用于加密的一个不同的秘密/键!),这样的选择可以与给定值的哈希轻松完成。
如果您无法使用(即利用用于标识记录的值不同)这样的技术,那么你可能无法得到周围选择所有数据集,解密他们,并质疑手动搜索记录。
如果你的DBMS支持AES加密/解密,你可以尝试使用该功能,它很可能会表现得比解密,并与PHP更好的选择。但要确保你评估可能通过暴露的加密密钥的DBMS出台可能存在的安全隐患相关的!