通过使用crypto模块,很容易在节点中创建私钥/公钥对。但是如何计算密钥的“指纹”?

OpenCrypto具有类似的内容:

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


那相当于节点加密模块呢?

最佳答案

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 OpenCrypto.getFingerprint模块中没有crypto对应物。但是您只需花费很少的精力就可以使用上述crypto函数编写自己的函数。

关于node.js - 从rsa键获取“指纹”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60393439/

10-11 14:14