【问题标题】:cakephp : how can i store a encrypted data into db and then decrypt it through keycakephp:如何将加密数据存储到数据库中,然后通过密钥解密
【发布时间】:2013-08-06 17:02:00
【问题描述】:

我正在开发 Cakephp 2.3 我正在尝试加密我存储到数据库中的数据,所以我寻找了一种方法来做到这一点。我找到了这个http://bakery.cakephp.org/articles/utoxin/2009/08/01/cryptable-behaviore

我不知道它是否是最好的行为,或者如果有人有更好的行为那么请建议我..

所以这里的问题是我已经阅读了链接中的所有详细信息,但我仍然无法知道如何将我的字段加密保存到数据库中

例如,我在控制器中有一个保存数据的功能

  $this->Messages->save($this->request->data);

如何将这些数据加密保存在数据库中

然后是我的模态

 public function getAllMessages($id){

    return  $this->find('all',array(
        'order'=> array( 'idTextMessage DESC'),
        'conditions' => array('User_id' => $id)));
}

我怎样才能解密这些数据

我已经这样做了,但没有工作

class Message extends AppModel{
public $useTable = 'textmessage';

public $actsAs = array( 
    'Cryptable' => array( 

        'fields' => array( 
            'mobileNo',
             'body' 
        ) 
    ) 
);

【问题讨论】:

  • 您可以在模型中使用beforeSaveafterFind 函数回调来加密/解密所需的字段。
  • @derek ...不工作 Derek.. 我的表格中的数据再次没有加密

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


【解决方案1】:

我没用过那个插件,但它是从 2009 年开始的,所以现在已经很老了。我不会太相信它。

使用 Cake 的 Security::rijndael 很容易解密/加密,无需使用插件(请注意,mcrypt php extension 需要安装 - 但很可能已经安装)。

首先,在您的模型中,添加您要加密的字段数组:

public $encryptedFields = array('mobile', 'body');

然后,像这样实现 beforeSave:

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;
}

您的 afterFind 方法应该几乎相同,除了它应该解密而不是加密:

public function afterFind($results = array()) {
    foreach($this->encryptedFields as $fieldName){
        if(!empty($results[$this->alias][$fieldName])){
            $results[$this->alias][$fieldName] = Security::rijndael($results[$this->alias][$fieldName], Configure::read('Security.key'), 'decrypt');
        }
    }
    return $results;
}

请注意,我还没有测试过所有这些代码 - 它是从我自己的一个应用程序中的零碎拼凑而成的。但它应该让你走上正轨。

【讨论】:

  • 非常感谢..我想我几乎接近我的解决方案了..我已经尝试过你的代码,我已经粘贴了你的代码,但现在数据在数据库中是空的..?跨度>
  • 你安装了 mcrypt 扩展吗?你可以使用 Security::rijndael 吗,即使是一个简单的案例?如果你把 debug($data);在 beforeSave 结束时,在返回 true 之前,你会得到什么?
  • 它已经安装在我的服务器 mcrypt.. 让我检查数据
  • 我已经这样做了 if(!empty($this->data[$this->alias][$fieldName])){ $this->data[$this->alias][$ fieldName] = Security::rijndael($this->data[$this->alias][$fieldName], Configure::read('Security.key'), 'encrypt'); } } 回声 $this->data;返回真;
  • 我在浏览器上收到错误消息,提示您不能对 Security::rijndael() [CORE\Cake\Utility\Security.php, line 220] 使用空密钥,数据的结果是来这个“数组”正在浏览器上打印
【解决方案2】:

好吧,后查找功能不起作用不知道为什么..所以我这样做..也许它可以帮助其他人..

public function beforeSave($options=array()) {
 if  ( isset ( $this -> data [ $this -> alias ] [ 'email' ] ) )  {
     $this -> data [ $this -> alias ] [ 'email' ]  =  Security::rijndael($this->data[$this->alias]['email'], Configure::read('Security.key'), 'encrypt');
    }
    if  ( isset ( $this -> data [ $this -> alias ] [ 'address' ] ) )  {
     $this -> data [ $this -> alias ] [ 'address' ]  =  Crypt :: encrypt ( $this -> Data [ $this -> alias ] [ 'address' ] ) ;
    }

}

后查找函数

 public function afterFind($results = array(),$primary = false) {

   foreach  ( $results  as  $key  =>  $Val )  {
         if  ( isset ( $Val [ 'User' ] ) )  {
             if  ( array_key_exists ( 'email' ,  $Val [ 'User' ] ) )  {
                 $results [ $key ] [ 'User' ] [ 'email' ]  = Security::rijndael($Val[ 'User' ] [ 'email' ], Configure::read('Security.key'), 'decrypt');

            }
 if  ( array_key_exists ( 'address' ,  $Val [ 'User' ] ) )  {
                 $results [ $key ] [ 'User' ] [ 'email' ]  = Security::rijndael($Val[ 'User' ] [ 'address' ], Configure::read('Security.key'), 'decrypt');

            }

        }
    }return $results;


 }

来源:http://be-hase.com/php/239/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 2012-04-07
    • 1970-01-01
    • 2016-03-15
    相关资源
    最近更新 更多