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

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

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

Creates and returns a Sign object that uses the given algorithm. On recent OpenSSL releases, openssl list-public-key-algorithms will display the available signing algorithms. One example is '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

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

Public 仅密钥算法:

  • "DSA"

单独哈希:

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

Public-密钥-算法-哈希对:

  • "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 的实现引起的。

我认为 Node 文档有误。对于 crypto.createSign(),使用以下命令列出可能性:

openssl list-message-digest-algorithms

运行 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' ]