PHP 和 Node.js 之间的 libsodium 实现差异

libsodium implementation differences between PHP and Node.js

我有一个 PHP REST(网关)服务器。客户端是 node.js 服务器。它们之间交换的数据分别使用 PHP 和 Node 的 libsodium easy api 实现进行加密 (crypto_secretbox) 和解密 (crypto_secretbox_open)。

PHP 中的加密数据在开头(salt)没有 16 个字节的零,而 node.js 中的加密数据有 16 个字节的零。

要在 PHP 中加密的数据节点上解密,我必须在调用 secretBox.decrypt.

之前添加 16 个字节的零(盐)

要解密在节点中加密的数据 PHP,我必须先删除 16 个字节的零,然后再调用 \Sodium\crypto_secretbox_open。

问题:这是最好的方法还是我遗漏了一些非常明显的东西?

您实际上是在将 secretbox_easy 与 Node-Sodium 一起使用,而不是 secretbox

secretbox 需要额外字节为 prepended/stripped。它仅用于向后兼容,在 C 语言除外的情况下使用它没有任何意义,但出于某种原因,Node-Sodium 提供了它。

PHP 绑定不需要这些额外的字节。像大多数其他绑定一样,secretbox 实际上是 secretbox_easy 在幕后。

好消息是 Node-Sodium 还提供了 secretbox_easy。您只需要显式调用它 secretbox_easy。不再需要填充。