如何最佳地加密/解密JSON字符串

11

我有一个运行mysql和php的web服务器,将数据发送到json字符串。

我有第二个web服务器读取数据,然后显示它。

目前一切正常。

我需要将一些敏感数据添加到字符串中,所以我想知道使用php加密/解密json的最佳方法是什么?

有人可以帮忙吗?


你考虑过使用加密库吗? - JohnFx
6个回答

15

我一直喜欢MCRYPT

//Key
$key = 'SuperSecretKey';

//To Encrypt:
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, 'I want to encrypt this', MCRYPT_MODE_ECB);

//To Decrypt:
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_ECB);
如果这是你正在寻找的内容。它会将JSON视为字符串,然后在解密后进行json_decode()或其他您正在执行的操作。

基本上就是我建议的,只不过你提供了实际的代码来实现;做得很好! - quickshiftin
1
mcrypt_encrypt和mcrypt_decrypt已被弃用并从PHP 7.2中移除。 - Alexander Smith

9

1
同意。 HTTPS才是正道。你不能等到最后一刻才决定要发送“秘密”的内容。你必须拥有一个共享的秘密。如果你没有共享的秘密,那么就使用HTTPS,因为它会为你处理。何必重复发明轮子呢? - Marcus Adams

5

这取决于数据的敏感程度。根据我的经验,简单的php加密通常可以解决问题。我通常会在将json数据字段编码为json字符串之前加密其中的敏感字段。

这是加密部分的代码:

$key = '密码(加/解)密'; $string = '要加密的字符串'; //注意空格

加密:

$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));

解密:

$decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encrypted), MCRYPT_MODE_CBC, md5(md5($key))), "\0");

然而,你应该始终对密码进行哈希处理(使用MD5、SHA1等算法),最好加一些盐。


盐值在使用MCRYPT_RIJNDAEL_256时不能超过24个字符,否则会被截断并抛出警告。如果要使用MD5,请优先选择substr(md5($salt), 0, 24)。 - Gabriel
最好不要使用PHP mcrypt,它已经被废弃,多年没有更新,并且不支持标准的PKCS#7(原名PKCS#5)填充,只支持非标准的空填充,甚至不能用于二进制数据。mcrypt存在许多未解决的错误,这些错误可以追溯到2003年。mcrypt扩展已被弃用,将在PHP 7.2中删除。相反,考虑使用defuseRNCryptor,它们提供了完整的解决方案,并得到维护和修正。 - zaph

1

在服务器上存储私钥并使用DES加密;这是一个双向算法。

编辑:

根据评论,看来我误解了问题。我的假设是OP想要像在电子邮件中发送加密数据一样在互联网上发送加密数据,然后在以后的某个时间获得数据并能够解密它。将来在提交答案之前,我会通过评论进行澄清。


我已经成功加密了JSON,但是不知道如何解密它或者找到解密的代码... - Steve
你打算重新发明 SSL 协议吗? - alexsuslin
看起来你找不到那个问题:https://dev59.com/iXRB5IYBdhLWcg3weXOX - alexsuslin
1
DES?为什么您会推荐使用所有算法中的DES? - Kitsune
1
@quickshiftin DES 被认为非常不安全,多年前已被美国政府替换为 AES,即高级加密标准(具体来说是 Rijndael 算法的一种变体)。甚至在 AES 出现之前,3DES 就被设计出来改善 DES 的不足安全性。几年前,一个专门的机器被创建出来可以在不到一天的时间内破解 DES。通过使用 Intel 的 SandyBridge 处理器上的 AES-NI 加速,AES 也可以几乎零额外开销地进行加密/解密! - Kitsune
显示剩余3条评论

0

通过“公钥/私钥对”,我认为您指的是非对称RSA加密。RSA不是设计用于加密数据,它速度较慢且可以加密的数据长度必须小于密钥大小。 - zaph

-1

当然,在网络上安全地传输数据需要 SSL(HTTPS)。

但是,即使如此,在发送 JSON 数据之前加密它们仍然有其必要性。

我曾经遇到过一个加密 JSON 数据的问题。这是由于 JSON 数据中的 "\t" 导致的。 在加密之前,您需要将其删除。否则,当您想将其解密回适当的 JSON 格式时,会出现问题。

$plain_txt = str_replace("\r",'', $plain_txt);

$plain_txt = str_replace("\n",'', $plain_txt);

$plain_txt = str_replace("\t",'', $plain_txt);

请参考以下工作示例: https://gist.github.com/petermuller71/33616d55174d9725fc00a663d30194ba


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接