1

我正在开发 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' 
        ) 
    ) 
);
4

2 回答 2

7

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

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

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

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

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

于 2013-08-07T11:56:36.253 回答
-1

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

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/

于 2013-08-08T07:50:55.643 回答