1

我的模型中有一个 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我上面加密的与数据库中的加密手机号码不同。

4

1 回答 1

1

这是因为每次调用都Security::rijndael()使用随机初始化向量

为了解决这个问题,您必须使用固定的 IV,但这会降低安全性,所以这可能不是一个好主意!

对于这种情况,我通常使用确定性加密另外加密该值,并在附加列中存储该值的HMAC 哈希不是常规哈希!还应该使用与用于加密的密钥不同的密钥/密钥!)可以使用确定性加密值的哈希轻松完成选择,并且您会注意到完全失去了非确定性加密的改进安全性。

如果您不能使用这种技术(即使用不同的值来识别记录),那么您可能无法绕过选择所有数据集、解密它们并手动搜索有问题的记录。

如果您的 DBMS 支持 AES 加密/解密,您可以尝试使用该功能,它的性能很可能比使用 PHP 解密和选择更好。但请确保您评估了可能通过将加密密钥暴露给 DBMS 而引入的与安全相关的陷阱!

于 2013-08-15T10:23:17.870 回答