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 に答える