json_decode在已通过加密的字符串上返回NULL
问题描述:
我试图保护我的数据库的信息,并且标准数据类型是JSON,我只是写了一些简单的mcrypt
函数来加密和解密任何文本,它们是:json_decode在已通过加密的字符串上返回NULL
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,因为它在去
谁能告诉我为什么会发生这种情况?
UPDATE
我之前和之后发现strlen()
是不同的。那么,我该如何确保它在整个加密过程中保持不变或在完成后进行修复?
答
BIN2HEX写着:
033303539222c2274797065223a22686f6d65227d00000000000000000000
这意味着你已经解密的字符串中的尾随NUL字节。发生这种情况是因为mcrybt_cbc
以块为单位进行操作。它会填充输入和输出到16(或24)字节的倍数来完成。 (输出可能有时甚至包含垃圾;因此,长度字段通常会出现在大多数加密方案/容器格式中。)
在您的这段代码中,您可以在解密后应用rtrim
。或者更确切地说:
json_decode(rtrim(decrypt($key, $locked), "\0"), true);
如果'decrypt'的输出是相同的,那么这不会发生。检查字符串长度......解密输出可能用ASCII空字符填充。 – cdhowie
向我们展示解码字符串的'bin2hex()'转储。 – mario
这些加密函数是垃圾。你的随机iv在哪里? – rook