我的模型中有一个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
与db中的加密移动号码不同。
答案 0 :(得分:1)
这是因为Security::rijndael()
在每次通话时都会使用随机initialization vector。
为了解决这个问题,你必须使用固定的IV,但这会降低安全性,所以这不是一个好主意!
对于这种情况,我通常会在表格中添加另一个字段,其中未加密的值以HMAC hash的形式存储(不是常规哈希!还应该使用不同的秘密/密钥比用于加密的密钥!),这样可以使用给定值的哈希轻松完成选择。
如果您无法使用这种技术(即使用不同的值来识别记录),那么您可能无法选择所有数据集,解密它们并手动搜索有问题的记录。
如果您的DBMS支持AES加密/解密,您可以尝试使用该功能,它很可能比解密和选择PHP更好。但请确保您通过将加密密钥暴露给DBMS来评估可能引入的与安全相关的陷阱!