Cakephp使用RIJNDAEL加密解密

时间:2013-08-15 09:17:03

标签: cakephp encryption cakephp-2.0 cakephp-2.1 rijndael

我的模型中有一个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中的加密移动号码不同。

1 个答案:

答案 0 :(得分:1)

这是因为Security::rijndael()在每次通话时都会使用随机initialization vector

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

对于这种情况,我通常会在表格中添加另一个字段,其中未加密的值以HMAC hash的形式存储(不是常规哈希!还应该使用不同的秘密/密钥比用于加密的密钥!),这样可以使用给定值的哈希轻松完成选择。

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

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