【问题标题】:json_encode does not work on encrypted stringjson_encode 不适用于加密字符串
【发布时间】:2014-07-04 23:05:16
【问题描述】:

我遇到了一些麻烦,因为我想加密从表单中获取的一些帖子数据,然后以 json 格式将它们发送到我的 nodejs 服务器以将它们放入数据库中。

我的问题:一旦数据被加密,我似乎无法发布数据。我可以发布 json 字符串就好了,但不能再发布了:

我的代码:

$rsa->loadKey($keydata);
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);

$encrypted = $rsa->encrypt("test");

$jsonArray = array(
    'crypt' => $encrypted
);
$jsonArrayEncoded = json_encode($jsonArray);
echo $jsonArrayEncoded;

$ch = curl_init('https://..........');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonArrayEncoded);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);

我什至没有得到回声输出。但是字符串似乎被加密了,因为我可以回显它(很多字符集错误+一些随机字母和数字),如果我在 php 脚本中对其进行解码,我也会得到正确的结果。我没有收到任何控制台警告或错误,无论是在 chrome 中还是在 firefox 中。

我做错了什么? (肯定有)

e:我将其用作加密库:http://phpseclib.sourceforge.net/rsa/examples.html#encrypt,enc1

edit2:好吧,按照 cmets 中的建议,我将字符串转换为 utf8,但现在用我的密钥解密似乎太长了...艰难 o 只加密了“test”这个词...

我想我必须深入挖掘......

如果有人知道:为了解密,我正在使用带有以下代码的 node.js 的 Ursa 模块:

var buffer = new Buffer(req.body.crypt);

var data = private.decrypt(buffer, 'utf8', 'utf8', ursa.RSA_PKCS1_PADDING);

【问题讨论】:

  • 可能是字符集问题,您是否尝试在加密和 json'ing 之间应用 utf8_encode()
  • 因为我不知道那个功能没有......但它确实有效,有点......
  • “太长无法解密”是什么意思?显然你会在解密之前解码 - 所以对于加密过程,编码根本不应该有任何区别
  • 是的,当我尝试用 ursa 对其进行解码时,我仍然得到一个“比 modlen 更长”的错误......我为两者选择了相同的填充方法,所以我认为还有另一个问题,进入我明天去看看。

标签: php json node.js encryption phpseclib


【解决方案1】:

好吧,按照 cmets 中的建议,我将字符串转换为 utf8,但是 现在用我的密钥解密似乎太长了...艰难的o 只加密了“test”这个词……

查看您更新后的代码会有所帮助。代替这样做...

json_encode 本身并不处理二进制数据。我的建议是这样做:

$jsonArray = array(
    'crypt' => bin2hex($encrypted)
);
$jsonArrayEncoded = json_encode($jsonArray);
echo $jsonArrayEncoded;

不过,在用 Java 对它进行 json 解码后,您需要将其压缩回二进制文件。

或者,您可以稍后执行 base64_encode 和 base64 解码。

我对 utf8 编码的担忧是 PHP 的内部字符串类型不是 utf8。如果是 Java 的话,那似乎会导致问题。

【讨论】:

  • 我稍后会尝试。我现在的代码没有太大变化,我只是在 json_encode() 之前添加了一个 utf8_encode(),不过我也可以稍后发布。
【解决方案2】:

json_encoding 函数有许多可以传递给它的标志,使函数能够解析特定的字符集。以下电话可能会解决您遇到的问题

json_encode($jsonArray, JSON_UNESCAPED_SLASHES | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP );

【讨论】:

  • 抱歉,这些都没有帮助 :( 如上所述,将字符串转换为 utf8 确实有效。
  • 好的。无论如何,对于未来值得了解。祝你的项目好运
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 2017-08-11
  • 2018-10-10
  • 1970-01-01
相关资源
最近更新 更多