使用cakephp中的CallBack方法解密和加密

时间:2016-01-15 20:02:41

标签: php cakephp encryption cakephp-2.x

我希望使用Callbacks方法在将值存储到我的数据库之前对其进行加密,然后在将值显示回应用程序之前对其进行解密。

我使用了documentation中提供的一个示例。

在我的core.php中,我提出以下内容:

Configure::write('Security.cipherCriptKey','su0HKssPmdbwgK6LdQLqzp0YmyaTI7zO');

在我的模型中,我使用了两种方法:

  1. beforeSave()

    public function beforeSave($options = array()) {
    
        $value=$this->data['Internship']['encryptedindb'];
        $encrypted = Security::encrypt($value, Configure::read('Security.cipherCriptKey'));
        $this->data['Internship']['encryptedindb'] = $encrypted;
        return true;
    }
    
  2. afterFind()

    public function afterFind($results, $primary = false) {
    
        foreach ($results as $key => $val) {            
            if(isset($val['Internship']['encryptedindb'])){
                $results['Internship']['encryptedindb'] = Security::decrypt($val['Internship']['encryptedindb'], Configure::read('Security.cipherCriptKey'));
            }
            return $results;
        }        
    }
    
  3. beforeSave()似乎工作正常,因为我可以在我的数据库中看到加密的值。但是,在我看来,当我想看到解密字段的内容时,它会将其显示为空字段。好像afterFind()方法无法解密它(它总是返回false)。

    以下是我的应用程序视图的屏幕截图:

    View

    带有加密值的数据库:

    DB

1 个答案:

答案 0 :(得分:5)

函数Security::encrypt($text)使用AES-256算法加密$text。它返回二进制数据,因此,它应存储在二进制数据类型中,而不是文本类型。

以下任何一项都应该有效:

  • BINARY
  • VARBINARY
  • BLOB (TINYBLOB,BLOB,MEDIUMBLOB和LONGBLOB)。

将其设置为VARBINARY(255)应该足够了。

有关进一步参考,请参阅: