javascriptnode.jscryptojspublic-key

How do I determine the algorithm of a public key in nodejs?


Given a public key of the following form (invalidated in example), how would I find the algorithm used in Node.js, using the crypto package?

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhZPjbR5OWOjXeAT/MvrK
TeS5aKhSZJgdm6/Mq7DWgUWIQ3aIHqiXRpWd9WPG7n9/YSPmwcbmiJLUVETt3400
gSd9AoabzOMZsJYz6fsxC9+M54RV4x8Ef5Rej2cc6m9iTfzc9uRpJtDulYGNGWCF
crOLLbMVGgeKjDmqF57s2OWG2xSmy1+MpY9GqWgDBWvdEF7+pNrc1HcHMd2ELOKS
QKbUcE6w24ro71bLSW9FZexWwQNr6fYRqBxyrlobYserl9kKZNkbBsBdezFT8S8c
ZM8WUVzYpNR2mXdrs+fumKFljSG32dLfnI70eVeEX1oMSB/9bzvtPfS36KSZ+PPs
FQIDAQAB
-----END PUBLIC KEY-----

The main goal is to ensure that the provided key is valid on application initialisation and that it is using an algorithm that is supported by Node.js.

I did look at crypto.createVerify, but that requires knowing the algorithm before hand, hence looking for other approaches.


Solution

  • createPublicKey can be used to reconstruct the object from a public key and asymmetricKeyType can be used to infer the algorithm used.

    const { createPublicKey } = require('crypto');
    
    const publicKeyPemRSA = `-----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzC5RNOewXjMZY9lwE5qz
    ivz4C6vc9cqO3byYby7od5gOBnJv5E16B1jsUhkH8LdfjFz9gqv0gtlCIfgF4ffr
    V5zEyFyz9p4e7QBaZz3ADPNT6+58rKScuA0gOsVp+k8/xYmR35O7UPKhcfY1XzQF
    bzFkbwBQYkEn91YZ/y7F5lcL7Xtv7jULu/Vu/7ZbOIrhr6Zbmcgy1aFA7+jVb6F5
    5GonN7oZvErnCRG31rIVipA3WlrLVYVj83ctf/FlROc4yy1m0/U9XYQbh5Qv5XzL
    0cmOq7Wn5+O6jBmqg3qaAO4l3l2QtjqIEcNO0DzBMQzKK8zFfv8zFscz8Wq9znfv
    JwIDAQAB
    -----END PUBLIC KEY-----`;
    
    const publicKeyRSA = createPublicKey(publicKeyPemRSA);
    console.log(publicKeyRSA.asymmetricKeyType); // logs: "rsa"