我正在尝试为以下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中的?
答案 0 :(得分:2)
正常签名操作包括哈希计算,然后(如果函数需要),然后通过私钥加密。散列是消息的压缩 - 较小 - 表示消息,不能找到重复的散列(冲突)。对于RSA,然后使用PKCS#1 v2.1(公共标准)中的方案填充消息,之后执行模幂运算。
模幂运算通常被错误地称为加密,加密需要为RSA使用不同的填充方法(并且不对加密执行散列)。
您不应该使用openssl_private_encrypt
来签署字符串,它是一个已弃用的函数,主要用于相对特定的身份验证目的。当它单独使用时,它使用用于签名的填充来加密数据,但它确实省去了散列和散列指示符。
要为openssl_private_encrypt
创建等效项,您需要能够执行PKCS#1 v1.5填充方法和模幂运算。您可以从Node.js的源代码中检索这些函数,您不太可能在更高级别的API中找到它们。但是,建议您取消PHP中的openssl_private_encrypt
函数并使用更高级别的签名函数。