0

我对 JSON 还不太了解,我刚开始学习这个教程,所以请多多包涵:

http://pymotw.com/2/json/

我的问题是我可以使用 JSON 将包含加密部分的消息发送到 Python 服务器,以便它可以将其转发到另一台服务器吗?

该消息将来自一个通过 SSL 的 Javascript 客户端,其中包含 Python 服务器的一些信息和一个要转发到另一个 Python 服务器的加密消息。该消息将如下所示:

{ref_obj { msg_obj }_pub_k }_SSL

这可能吗?我看到了这个帖子:

Python pycrypto 模块:为什么 simplejson 不能转储加密字符串?

如果这不能用 JSON 完成,有人可以建议应该如何完成吗?我唯一的要求是原始消息必须来自 Javascript 客户端(因为它将是 Chrome 中的插件)并转到 Python 服务器进行转发。

提前致谢!

4

2 回答 2

2

您可以简单地加密 JSON 并将密文作为原始二进制数据发送。

JSON 只是一种格式;没有人强迫您通过网络发送它。

于 2013-04-12T14:04:45.137 回答
1

是的,

但某些字符串必须在发送之前转义,然后在另一端转义。通过from base64 import b64encode, b64decode或类似的东西。

这样做的原因是 JSON 数据必须是字符串或整数值,基本上没有别的。

json.dumps({1 : 2, 'hey' : 'you'})将起作用,这就是您需要保留它的格式。这意味着二进制数据可能会与 json 混淆,因为它需要“正常”字符串。b64encode 确保它只是字符串中的有效字符,没有别的:)

取决于您要完成的工作。您还可以加密整个 JSON 字符串并将其发送到服务器,解密并将其解析为 JSON。

将加密视为隧道。

JSON -> 加密(JSON-string) -> 服务器 -> 解密 -> 解析 JSON

或者,如果您需要 JSON 数据作为元数据,请执行第一个选项。

这是一种将所有流量封装为“加密”的方法

def encrypt(s):
    encryptedString = AES.encrypt(s)
    return b64encode(encryptedString)

sock.connect(server)
jsondata = {1 : 2}
sock.send( encrypt(json.dumps(jsondata)) )

在服务器上,您只需执行以下操作:

data = sock.recv(1024)
jsondata = json.loads( b64decode(decrypt(data))) )
print(jsondata)

这是一种仅加密部分 json 数据的方法:

def encrypt(s):
    encryptedString = AES.encrypt(s)
    return b64encode(encryptedString)

sock.connect(server)
jsondata = {1 : encrypt(2)}
sock.send( json.dumps(jsondata) )

在服务器上:

data = sock.recv(1024)
jsondata = json.loads(data)
jsondata[1] = decrypt(b64decode(jsondata[1]))
于 2013-04-12T14:03:20.707 回答