【问题标题】:json_decode returns NULL on string that has passed through encryptionjson_decode 在已通过加密的字符串上返回 NULL
【发布时间】:2011-09-02 01:52:45
【问题描述】:

我正在尝试保护我的数据库中的信息,标准的数据类型是 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 的输出与输入时的相同

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

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

【问题讨论】:

  • 如果decrypt 的输出相同,则不会发生这种情况。检查字符串长度...解密输出可能会用 ASCII 空字符填充。
  • 向我们展示解码后字符串的bin2hex() 转储。
  • 这些加密函数是垃圾。你的随机静脉注射在哪里?
  • bin2hex 读取:7b226e756d626572223a2237383635333033303539222c2274797065223a22686f6d65227d0000000000000000000000
  • @Rook 我真的很想知道random iv 是什么,你有关于这个主题的一些文献吗?

标签: php security encryption json


【解决方案1】:

bin2hex 读取:
033303539222c2274797065223a22686f6d65227d00000000000000000000

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

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

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

【讨论】:

    猜你喜欢
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多