node.js 中的十六进制编码 ECDSA 密钥

Posted

技术标签:

【中文标题】node.js 中的十六进制编码 ECDSA 密钥【英文标题】:Hex encode ECDSA keys in node.js 【发布时间】:2013-11-25 23:36:59 【问题描述】:

我正在构建一个与 API 服务器通信的 nodejs 应用程序。 API 服务器要求我向它发出的每个请求都包含一个 X-Signature 标头,该标头使用 prime256v1 ECDSA 曲线和 sha256 散列在一组特定数据上。

我查看了crypto 和tls 文档,但没有找到合适的。我已经成功地使用openssl ecparam -name prime256v1 -genkey 生成了一个私钥,但它是 PEM 格式的。我还生成了一个 DER 格式密钥。这两者都包括一些额外的元数据,如所使用的曲线以及在 PEM 的情况下为 cmets。

我可以使用这些密钥对自己的操作进行签名,但服务器要求我使用十六进制编码上传公钥(以便服务器可以验证我对请求所做的签名。)

具体来说,服务器想要以下 Python 代码的输出:

from ecdsa import SigningKey
from binascii import hexlify
hexlify(SigningKey.from_pem(content).to_string())

pubkey 的示例输出(无换行符):c5bd76cd0cd948de17a31261567d219576e992d9066fe1a6bca97496dec634e2c8e06f8949773b300b9f73fabbbc7710d5d6691e96bcf3c9145e15daf6fe07b9

我不希望将 python 作为依赖项添加到我的节点应用程序...任何人都知道我可以从 PEM 或 DER 文件中提取代表我的私钥的二进制数据的方法,这样我就可以将它放在缓冲区中并打电话给buffer.toString('hex')?或者我可以使用本机 crypto 库生成 ECDSA 密钥对的方法?或者一个可以做同样事情的图书馆?

【问题讨论】:

【参考方案1】:

openssl 本身可以以十六进制打印出事物的内脏。

键有变化吗?听起来你可以一次解码成十六进制,然后使用它?不需要依赖 - 只需将十六进制粘贴到您的节点源中?

【讨论】:

以上是关于node.js 中的十六进制编码 ECDSA 密钥的主要内容,如果未能解决你的问题,请参考以下文章

OpenSSL DER ECDSA 编码错误

组合 ECDSA 密钥

如何使用 C#.NET 的 PEM 文件中的 P-256 密钥计算 ECDSA 签名?

如何从 R 中的散列消息和签名中正确恢复 ECDSA 公钥 ||小号 || V格式?

无法从 Java 读取 OpenSSL 生成的 ECDSA 密钥:InvalidKeySpecException

如何从 Dart 将 x、y 坐标编码为 python ecdsa VerifyingKey 格式