0

モデルの beforeSave メソッドで一部のデータを暗号化しようとしています。しかし、それは保存されていません。

       $currentBalance = $this->find("all", array(
            "fields" => array(
                "SUM(base_amount) as 'CurrentBalance'"
            ),
            "conditions" => array(
                "Payment.user_id" => $this->data["Payment"]["user_id"]
            )
        ));

        $this->log($this->data["Payment"]);
        $this->log(Configure::read("Security.salt"));        
        $this->log(Security::cipher(implode("|", $this->data["Payment"]), Configure::read("Security.cipherSeed")));

        $this->set("balance", $currentBalance[0][0]["CurrentBalance"] + $this->data["Payment"]["base_amount"]);
        $this->set("balance_checksum", Security::cipher(implode("|", $this->data["Payment"]), Configure::read("Security.salt")));

ログファイルを見ると、ある種の暗号化されたデータが得られますが、すべて意味不明です。

データベースにいる間、私はまったく何も得ません。

暗号関数を「123」などの単純な文字列に置き換えると、正しく保存されます。

データベース接続が utf8 でエンコードされており、データベースのフィールドに utf8 照合があることを確認しました。

これに関する指針は素晴らしいでしょう

ありがとう

4

1 に答える 1

4

私は同様の問題に取り組んできました。問題は、データの暗号化によって無効な utf8 文字が作成されることでした。漢字など。私がしたことは、暗号化された文字列を16進数に変換してから保存することです。データを取得するときは、16 進数から文字にデコードしてから解読します。

(AppModel.php 内)

<?php
/**
 * Encrypts a sensible string for the bd
 * @param string $toEncrypt
 * @return string  encrypted hexadecimal 
 */
function encryptCipher($toEncrypt) {
    $CipherKey = Configure::read('Security.cipherSeed');
    return bin2hex(Security::cipher($toEncrypt, $CipherKey));
}
?>

(AppController.php で) 復号化メソッド。モデルとまったく同じ方法で $this->CipherKey が __construct に読み込まれます。

<?php function __construct(){
$this->CipherKey = Configure::read('Security.cipherSeed');
}

/**
 * The main decrypting function
 * 
 * @param string $strToDecrypt the string to be decrypted
 * @return string the decrypted string 
 */
public function decryptCipher($strToDecrypt) {
    return Security::cipher(pack("H*", $strToDecrypt), $this->CipherKey);
}
?>
于 2012-08-07T18:10:14.097 に答える