OpenCrypto.getFingerprint 以 X509 DER 格式导出公共 RSA 密钥,并为这些数据创建哈希。这同样适用于私有 RSA 密钥,不同之处在于私有密钥以 Pkcs8 DER 格式导出。摘要可以在选项中指定(默认值:SHA 512)以及数据是作为缓冲区还是作为十六进制字符串返回(默认值:十六进制字符串)。
在 NodeJS 代码中,可以使用crypto.generateKeyPair 生成密钥,从而可以显式指定密钥格式。如果密钥尚未采用适当的格式(X509 DER 和 Pkcs8 DER),则可以执行密钥转换以生成 OpenCrypto.getFingerprint 创建的相同指纹。适合这些操作的函数是crypto.createPublicKey 或crypto.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 函数编写自己的函数。