javascript - 无法在 Node js中使用加密创建签名

标签 javascript node.js rsa sha256

我正在尝试使用 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 作为对象传递,因此通常必须使用属性 keyformattype关键描述,在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 ,从而导致错误。解决方案是显式指定 formattype,例如:

{ 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/

相关文章:

javascript - 迭代数组时每三个元素换行一次

javascript - 如何防止 lodash mapKeys 重新排序我的数组?

javascript - 有没有一种方法可以让 Javascript 模仿面向对象的语言?

rsa - 使用 pkcs#11 api 使用 RSA 签署 sha256 哈希?

c# - 在Python中使用公共(public)模数和指数进行RSA加密密码

javascript - Jasmine toHaveBeenCalledWith 部分匹配

node.js - 在 Mac OS 上使用 WebRTC 和 Electron 进行屏幕共享和视频/音频通话

javascript - 从 Imgur API 接收到 "Uploading file too fast!"错误

javascript - 为什么需要browserify `paths`定义?

mysql - MySQL中存储加密数据RSA