我正在尝试使用 RSA-SHA25 算法创建签名。这是下面的代码
const data = "My data";
const sign = crypto.createSign("RSA-SHA256");
sign.update(Buffer.from(data, "utf8"));
signature = sign
.sign({ key: privateKey, padding: crypto.constants.RSA_PKCS1_PSS_PADDING })
.toString("base64");
问题是我收到此错误。我在互联网上搜索但找不到正确的解决方案。
internal/crypto/sig.js:105 const ret = this[kHandle].sign(data, format, type, passphrase, rsaPadding, ^
Error: error:0909006C:PEM routines:get_name:no start line
最佳答案
在发布的 NodeJS 代码中, key 作为对象传递,因此通常必须使用属性 key
、format
和 type
关键描述,在sign.sign(privateKey[, outputEncoding])
的文档中有详细解释和 crypto.createPrivateKey(key)
.
这里key
包含 key Material ,format
指定编码('pem'
或'der'
,其中 'pem'
是默认值)和 type
类型(对于 RSA,可以是 'pkcs1'
或 'pkcs8'
,其中仅当 format
等于 'der'
时才需要此参数。
如果这些属性不一致,一般会出现错误。
例如,在发布的代码中,未明确指定format
,因此使用默认的'pem'
。如果 key privateKey
是 DER 编码 key (在缓冲区中),则存在不一致,会导致错误消息 Error: error:0909006C:PEMroutines:get_name:no start line:由于隐式指定的 format
'pem'
,PEM 编码的 key 需要带有相应的 header ,而 DER 编码的 key 缺少该 header ,从而导致错误。解决方案是显式指定 format
和 type
,例如:
{ key: privateKey, format: 'der', type: 'pkcs8', padding: crypto.constants.RSA_PKCS1_PSS_PADDING }
对于 PKCS#8 key (或 'pkcs1'
对于 PKCS#1 key )。
相反,对于
{ key: privateKey, padding: crypto.constants.RSA_PKCS1_PSS_PADDING }
privateKey
必须是字符串或缓冲区形式的 PEM 编码 key 。
关于javascript - 无法在 Node js中使用加密创建签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63752197/