json_decode在已通过加密的字符串上返回NULL

时间:2011-09-02 01:52:45

标签: php security encryption json

我正在尝试保护我的数据库上的信息,标准类型的数据是JSON,我只是写了一些简单的mcrypt函数来加密和解密任何文本,这里是:

function encrypt($key, $data){
    $encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $data, MCRYPT_ENCRYPT);
    return base64_encode($encrypted_data);
}

function decrypt($key, $encryptedData){
    $decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, base64_decode($encryptedData), MCRYPT_DECRYPT);
    return $decrypt;
}

我有一个有效的JSON字符串,我测试了json_decode而没有通过加密,它可以工作。但是当我加密然后解密它然后尝试json_decode它只返回NULL

现在我只是在一个简单的脚本中调试它:

include("coreFunctions.php");

$arr = '{"number":"4646464646","type":"home"}';

$key = "ladida";
$locked = encrypt($key, $arr);

var_dump($locked);
var_dump(json_decode(decrypt($key, $locked), true));

已经验证了decrypt的输出是 SAME 的输出。

谁能告诉我为什么会这样?

更新
我发现strlen()之前和之后是不同的。那么我怎样才能确保它在整个加密过程中保持不变或在完成后修复它?

1 个答案:

答案 0 :(得分:3)

  

bin2hex读取:
  033303539222c2274797065223a22686f6d65227d00000000000000000000

这意味着您在解密的字符串中有尾随NUL字节。发生这种情况是因为mcrybt_cbc以块为单位运行。它会将输入和输出填充到16(或24)个字节的倍数来执行此操作。 (输出有时甚至可能包含垃圾;因此,长度字段通常会占用大多数加密方案/容器格式。)

您可以在解密后应用rtrim。或者更确切地说:

 json_decode(rtrim(decrypt($key, $locked), "\0"), true);