Node.js' crypto.createSign() 的有效算法输入字符串

Valid algorithm input strings for Node.js' crypto.createSign()

本文关键字:有效 算法 字符串 输入 createSign js crypto Node      更新时间:2023-09-26

我正在为一个项目使用node的加密签名,并且一直在尝试考虑各种算法的起伏。crypto.createSign()的说明如下:

创建并返回使用给定算法的 Sign 对象。在最近的 OpenSSL 版本中,openssl list-public-key-algorithms将显示可用的签名算法。一个例子是"RSA-SHA256"。

不幸的是,"RSA-SHA256"不是openssl list-public-key-algorithms的输出值之一(如下所示)。

那么这个函数的有效值是什么,或者如何从下面的列表中提取它们呢?

OpenSSL list result:
Name: OpenSSL RSA method
        Type: Builtin Algorithm
        OID: rsaEncryption
        PEM string: RSA
Name: rsa
        Type: Alias to rsaEncryption
Name: OpenSSL PKCS#3 DH method
        Type: Builtin Algorithm
        OID: dhKeyAgreement
        PEM string: DH
Name: dsaWithSHA
        Type: Alias to dsaEncryption
Name: dsaEncryption-old
        Type: Alias to dsaEncryption
Name: dsaWithSHA1-old
        Type: Alias to dsaEncryption
Name: dsaWithSHA1
        Type: Alias to dsaEncryption
Name: OpenSSL DSA method
        Type: Builtin Algorithm
        OID: dsaEncryption
        PEM string: DSA
Name: OpenSSL EC algorithm
        Type: Builtin Algorithm
        OID: id-ecPublicKey
        PEM string: EC
Name: OpenSSL HMAC method
        Type: Builtin Algorithm
        OID: hmac
        PEM string: HMAC
Name: OpenSSL CMAC method
        Type: Builtin Algorithm
        OID: cmac
        PEM string: CMAC

好的,经过一些暴力破解和良好的猜测,有效算法输入字符串的结构似乎没有什么意义。开始看起来像规则的东西有很多例外。如果省略公钥算法,RSA 似乎是默认值。以下是 DO 工作的值的不完整列表:

仅公钥算法:

  • "DSA"

单独哈希:

  • "MD4"
  • "MD5"
  • "沙"
  • "DSS1"
  • "MDC2"
  • "SHA1"
  • "SHA224"
  • "SHA256"
  • "SHA512"

公钥算法哈希对:

  • "RSA-MD4"
  • "RSA-MD5"
  • "RSA-SHA"
  • "RSA-MDC2"
  • "RSA-SHA1"
  • "RSA-SHA224"
  • "RSA-SHA256"
  • "RSA-SHA512"
  • "DSA-SHA"
  • "DSA-SHA1"

我不是密码学家,所以RSA可能需要明确的哈希选择,或者DSA与sha512或md5不兼容,但我发现这些不一致更有可能是由openSSL的实现引起的。

运行crypto.getHashes()以获取可用签名算法的列表。

例如,如果您在节点v8.15.0中运行它,则您将获得:

[ 'DSA',
  'DSA-SHA',
  'DSA-SHA1',
  'DSA-SHA1-old',
  'RSA-MD4',
  'RSA-MD5',
  'RSA-MDC2',
  'RSA-RIPEMD160',
  'RSA-SHA',
  'RSA-SHA1',
  'RSA-SHA1-2',
  'RSA-SHA224',
  'RSA-SHA256',
  'RSA-SHA384',
  'RSA-SHA512',
  'dsaEncryption',
  'dsaWithSHA',
  'dsaWithSHA1',
  'dss1',
  'ecdsa-with-SHA1',
  'md4',
  'md4WithRSAEncryption',
  'md5',
  'md5WithRSAEncryption',
  'mdc2',
  'mdc2WithRSA',
  'ripemd',
  'ripemd160',
  'ripemd160WithRSA',
  'rmd160',
  'sha',
  'sha1',
  'sha1WithRSAEncryption',
  'sha224',
  'sha224WithRSAEncryption',
  'sha256',
  'sha256WithRSAEncryption',
  'sha384',
  'sha384WithRSAEncryption',
  'sha512',
  'sha512WithRSAEncryption',
  'shaWithRSAEncryption',
  'ssl2-md5',
  'ssl3-md5',
  'ssl3-sha1',
  'whirlpool' ]

在节点 v10.15.1 中,您将获得:

[ 'RSA-MD4',
  'RSA-MD5',
  'RSA-MDC2',
  'RSA-RIPEMD160',
  'RSA-SHA1',
  'RSA-SHA1-2',
  'RSA-SHA224',
  'RSA-SHA256',
  'RSA-SHA384',
  'RSA-SHA512',
  'blake2b512',
  'blake2s256',
  'md4',
  'md4WithRSAEncryption',
  'md5',
  'md5-sha1',
  'md5WithRSAEncryption',
  'mdc2',
  'mdc2WithRSA',
  'ripemd',
  'ripemd160',
  'ripemd160WithRSA',
  'rmd160',
  'sha1',
  'sha1WithRSAEncryption',
  'sha224',
  'sha224WithRSAEncryption',
  'sha256',
  'sha256WithRSAEncryption',
  'sha384',
  'sha384WithRSAEncryption',
  'sha512',
  'sha512WithRSAEncryption',
  'ssl3-md5',
  'ssl3-sha1',
  'whirlpool' ]

我认为节点文档是错误的。对于crypto.createSign(),请使用以下命令列出可能性:

openssl list-message-digest-algorithms