无法在节点js中使用加密创建签名

unable to create signature using cryto in nodejs

我正在尝试使用 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 代码中,密钥作为 object 传递,因此通常必须将属性 keyformattype 用于密钥description,在sign.sign(privateKey[, outputEncoding]) and crypto.createPrivateKey(key).

的文档中有详细说明

特此key包含keymaterial,format指定编码('pem''der',其中'pem'为默认) 和 type 类型(对于 RSA,这可以是 'pkcs1''pkcs8',其中仅当 format 等于 'der' 时才需要此参数)。

如果这些属性不一致,一般会出错。

例如,在贴出的代码中,没有明确指定format,所以使用默认的'pem'。如果密钥 privateKey 是 DER 编码密钥(在缓冲区中),则存在导致错误消息 Error: error:0909006C:PEM routines:get_name:no start line:由于隐式指定 format 'pem',PEM 编码的密钥需要相应的 header,而 DER 编码的密钥缺少该密钥,从而导致错误。解决方法是显式指定formattype,例如:

{ key: privateKey, format: 'der', type: 'pkcs8', padding: crypto.constants.RSA_PKCS1_PSS_PADDING }

对于 PKCS#8 密钥(或 'pkcs1'对于 PKCS#1 密钥)。

相反,

{ key: privateKey, padding: crypto.constants.RSA_PKCS1_PSS_PADDING }

privateKey 必须是 PEM 编码的密钥作为字符串或缓冲区。