通过使用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.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 OpenCrypto.getFingerprint
模块中没有crypto
对应物。但是您只需花费很少的精力就可以使用上述crypto
函数编写自己的函数。关于node.js - 从rsa键获取“指纹”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60393439/