NodeJS中类型为'ec'的密钥使用的签名算法是什么?
NodeJS中
asymmetricKeyType: 'ec'类型密钥对应的签名算法说明 结论非常明确:asymmetricKeyType取值为'ec'的KeyObject,签名时使用的就是标准ECDSA算法,相关依据可以从NodeJS crypto模块的实现逻辑和实际运行表现交叉验证:
- 从类型定义的边界来看,
asymmetricKeyType的枚举值是严格按密钥体系拆分的:'ec'这个分类,仅指代基于NIST/SECG标准的Weierstrass形式椭圆曲线密钥(也就是常用的P-256、P-384、secp256k1这类曲线的密钥),NodeJS的crypto模块底层基于OpenSSL实现,这类密钥的签名、验签原语固定调用OpenSSL的ECDSA相关接口,没有其他签名算法绑定。- 容易混淆的其他椭圆曲线算法密钥有独立的类型标识,不会被归到
'ec'分类下:Ed25519/Ed448签名密钥的类型值为'ed25519'/'ed448',使用EdDSA算法;X25519/X448是密钥交换专用密钥,类型值为'x25519'/'x448',本身不支持签名操作。
- 实际运行验证可以直接佐证:
你可以在Node环境运行如下测试代码,生成的EC类型密钥仅支持ECDSA相关签名算法,传入RSA、RSASSA-PSS等其他签名算法时会直接抛出参数不匹配错误:const crypto = require('crypto') // 生成P-256曲线的EC密钥对 const { privateKey } = crypto.generateKeyPairSync('ec', { namedCurve: 'P-256' }) console.log(privateKey.asymmetricKeyType) // 输出固定为 'ec' // 用ECDSA配套算法签名可正常执行 const sig = crypto.sign('SHA256withECDSA', Buffer.from('test'), privateKey) // 传入RSA签名算法会直接报错 crypto.sign('RSA-SHA256', Buffer.from('test'), privateKey) // 抛出参数不匹配错误 - 日常开发中常见的JWT ES256/ES384/ES512签名套件,本质就是对应P-256/P-384/P-521曲线的EC密钥搭配SHA256/SHA384/SHA512哈希的ECDSA签名,这类套件在NodeJS中使用的密钥,
asymmetricKeyType全部为'ec',也可以作为实际场景的验证。
内容的提问来源于stack exchange,提问作者Jonathan Wilbur
相关产品推荐
相关产品推荐

