4

我正在尝试为以下 PHP 函数做同样的事情

openssl_private_encrypt

使用我的私钥签署一个字符串

这就是我正在做的

var signer = crypto.createSign('RSA-SHA256').update(timestamp + '|' + userId);
var signature = signer.sign(privKey, 'base64');

我的第一个问题是将 RSA 和 SHA256 放在一起意味着什么?我了解使用 RSA 私钥加密某些内容或使用 SHA256 对某些内容进行哈希处理意味着什么。但我无法理解把这两个放在一起意味着什么。

我把它放在那里是因为 createSign 需要一个字符串参数(不支持“RSA”),而 RSA-SHA256 是我找到的最接近的东西。

我的第二个问题是我该怎么做

openssl_private_encrypt

在 Node.js 中?

4

1 回答 1

3

正常的签名操作由哈希计算组成,然后(如果函数需要)然后由私钥加密。散列是消息的压缩 - 较小 - 表示,无法找到重复的散列(冲突)。对于 RSA,然后使用 PKCS#1 v2.1(公共标准)中的方案填充消息,然后执行模幂运算。

模幂运算通常被错误地称为加密,加密需要不同的 RSA 填充方法(并且加密也不执行散列)。

您不应该使用openssl_private_encrypt对字符串进行签名,它是一个已弃用的函数,主要用于相对特定的身份验证目的。当单独使用时,它使用用于签名的填充来加密数据,但它确实省略了散列和散列指示符。

要为您创建等效项,openssl_private_encrypt您需要能够执行 PKCS#1 v1.5 填充方法和模幂运算。您可能可以从 Node.js 的源代码中检索这些函数,但您不太可能在更高级别的 API 中找到它们。但是,建议您取消openssl_private_encryptPHP 中的函数并使用更高级别的签名函数。

于 2013-03-15T01:17:20.230 回答