【问题标题】:get »fingerprint« from rsa key从 rsa 密钥获取 »fingerprint«
【发布时间】:2020-06-09 02:49:07
【问题描述】:

通过使用crypto 模块,可以很容易地在node.js 中创建一个私钥/公钥对。但是如何计算密钥的“指纹”?

OpenCrypto 有类似的东西:

crypt.getFingerprint(key, options).then(function (fingerprint) {
  console.log(fingerprint)
})

节点加密模块的等价物是什么?

【问题讨论】:

    标签: node.js cryptography rsa


    【解决方案1】:

    OpenCrypto.getFingerprint 以 X509 DER 格式导出公共 RSA 密钥,并为这些数据创建哈希。这同样适用于私有 RSA 密钥,不同之处在于私有密钥以 Pkcs8 DER 格式导出。摘要可以在选项中指定(默认值:SHA 512)以及数据是作为缓冲区还是作为十六进制字符串返回(默认值:十六进制字符串)。

    在 NodeJS 代码中,可以使用crypto.generateKeyPair 生成密钥,从而可以显式指定密钥格式。如果密钥尚未采用适当的格式(X509 DER 和 Pkcs8 DER),则可以执行密钥转换以生成 OpenCrypto.getFingerprint 创建的相同指纹。适合这些操作的函数是crypto.createPublicKeycrypto.createPrivateKey。最后必须使用crypto.createHash 生成哈希。

    更新:

    指纹只不过是一个哈希值,例如使用摘要 SHA-512(如 OpenCrypto.getFingerprint):

    var fingerprint = crypto.createHash('sha512').update(key).digest('hex'); // Fingerprint (hash) as hexadecimal string
    

    其中 key 是任何格式的公钥或私钥 (string, Buffer, ...)。如果密钥是 X509 DER(公共)或 PKCS8 DER(私有),则指纹 匹配OpenCrypto.getFingerprint 的指纹。

    如果密钥是其他格式,也可以通过这种方式确定指纹。但是,如果指纹应该匹配OpenCrypto.getFingerprint 提供的值,那么在生成哈希之前,密钥当然必须转换为OpenCrypto.getFingerprint 使用的格式。这种转换不是很复杂,例如将公共 PKCS1 PEM 密钥 (publicKey) 转换为 X509 DER 密钥 (publicKeyDER),包括生成哈希:

    var publicKeyDER = crypto.createPublicKey(publicKey, { type: 'pkcs1', format: 'pem' }).export({ type: 'spki', format: 'der' }); // Convert a public PKCS1 PEM key into a X509 DER key
    var fingerprint = crypto.createHash('sha512').update(publicKeyDER).digest('hex');                                               // Fingerprint (hash) as hexadecimal string
    

    底线是这些在功能上与OpenCrypto.getFingerprint 中执行的操作相同。据我所知,NodeJS crypto 模块中没有 OpenCrypto.getFingerprint 对应项。但是您可以使用上述crypto 函数编写自己的函数。

    【讨论】:

    • 谢谢!希望这听起来比实际上更复杂:)
    • 它并不像乍一看那么复杂,请参阅我的答案中的更新部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 2020-12-26
    • 2012-01-02
    相关资源
    最近更新 更多