2017-10-29 11 views
0

Ich verwende diese Bibliothek, node-jwks-rsa, um JWT-Schlüssel aus meiner auth0 jwks.json-Datei abzurufen, um zu überprüfen, dass das ID_Token meine Anwendung abruft, nachdem die Authentifizierung tatsächlich von meinem Auth-Provider kommt.JWT öffentlicher Schlüssel und Signaturvalidierung für privaten Schlüssel - was ist der Unterschied?

Unter der Haube nutzt sie diese Methode einen öffentlichen Schlüssel PEM

export function certToPEM(cert) { 
    cert = cert.match(/.{1,64}/g).join('\n'); 
    cert = `-----BEGIN CERTIFICATE-----\n${cert}\n-----END CERTIFICATE-----\n`; 
    return cert; 
} 

(Unter Verwendung des x50c als Argument aus der .jwks-Datei) zu bauen.

die ich dann in Kombination mit jsonwebtoken verwenden, um zu überprüfen, dass der JWT (id_token) gültig ist.

Wie unterscheidet sich diese Verifikationsmethode von der Generierung eines privaten Schlüssels (RSA) aus dem Modul und Exponenten der jwks.json-Datei und deren Verwendung zur Verifizierung? (Als Beispiel siehe diese library)

Zusätzlich ist hier Funktion als Beweis dafür, dass

export function rsaPublicKeyToPEM(modulusB64, exponentB64) { 
    const modulus = new Buffer(modulusB64, 'base64'); 
    const exponent = new Buffer(exponentB64, 'base64'); 
    const modulusHex = prepadSigned(modulus.toString('hex')); 
    const exponentHex = prepadSigned(exponent.toString('hex')); 
    const modlen = modulusHex.length/2; 
    const explen = exponentHex.length/2; 

    const encodedModlen = encodeLengthHex(modlen); 
    const encodedExplen = encodeLengthHex(explen); 
    const encodedPubkey = '30' + 
     encodeLengthHex(modlen + explen + encodedModlen.length/2 + encodedExplen.length/2 + 2) + 
     '02' + encodedModlen + modulusHex + 
     '02' + encodedExplen + exponentHex; 

    const der = new Buffer(encodedPubkey, 'hex') 
     .toString('base64'); 

    let pem = `-----BEGIN RSA PUBLIC KEY-----\n`; 
    pem += `${der.match(/.{1,64}/g).join('\n')}`; 
    pem += `\n-----END RSA PUBLIC KEY-----\n`; 

    return pem; 
    }; 

Die zuvor erwähnte jsonwebtoken Bibliothek eine PEM von einem mod und Exponent (von http://stackoverflow.com/questions/18835132/xml-to-pem-in-node-js genommen) erzeugt, kann eine JWT überprüfen entweder - aber warum? Wenn beide Verifizierungsmethoden eine JWT-Signatur validieren können, warum gibt es beide? Was sind die Kompromisse zwischen ihnen? Ist einer sicherer als der andere? Welches sollte ich am besten verwenden?

+0

Nur der öffentliche Schlüssel (konfiguriert) wird für die Signaturprüfung verwendet. Unter der Haube müssen beide Bibliotheken einen Hash berechnen und die Hash-Signatur validieren. Bis die Validierung korrekt durchgeführt wurde, gibt es keinen Grund, dass eine sicherer wäre als eine andere. – gusto2

+0

@ gusto2 - Ich bin immer noch verwirrt. Warum ermöglicht der interaktive Debugger unter https://jwt.io/ die JWT-Signaturvalidierung mit den beiden Methoden, die ich oben beschrieben habe, öffentlich und privat, wenn nur der öffentliche Schlüssel verwendet wird? – TheFastCat

+0

Sie können eine digitale Signatur nicht mit einem privaten Schlüssel verifizieren. Unklar, was du verlangst. – EJP

Antwort

1

Mit einem RSA assymetrischen Schlüsselpaar wird der JWT mit dem privaten Schlüssel signiert und mit der Öffentlichkeit verifiziert. Sie können eine digitale Signatur mit dem privaten Schlüssel nicht überprüfen

Modul und Exponent sind die Komponenten des öffentlichen Schlüssels und Sie können es verwenden, um den öffentlichen Schlüssel im PEM-Format zu erstellen, das eine Base64-Darstellung des öffentlichen Schlüssels (Modulus) ist und Exponent) im binären DER-Format kodiert. Sie können PEM, DER oder Modulus und Exponent verwenden, weil die gleichen Informationen enthalten

Aber jeder kann den privaten Schlüssel mit Modul und Exponent nicht erstellen. Er würde die privaten RSA-Elemente benötigen, die geheim gehalten werden müssen, damit niemand für dich unterschreiben kann.

+0

Danke Pedro. Haben Sie irgendwelche Links zu Informationen darüber, wie sich all die verschiedenen Felder eines jwk/s aus Sicht von OpenId Flow darauf beziehen? Nämlich wo der x50c herkommt. Ich möchte mein Wissen und Verständnis erweitern. – TheFastCat

+1

OpenIdConnect oder Oauth2 sind nicht mit JWK (JsonWebKey) verwandt. JWK ist ein Format zur Darstellung des in diesem RFC definierten kryptographischen Schlüssels https://tools.ietf.org/html/rfc7517. Scheint [JKWS] (https://auth0.com/docs/jwks) ist ein Konzept von Auth0 _Ein JSON-Objekt, das eine Gruppe von JWKs_ darstellt. Das 'x5c'-Attribut ist das X509Certificate, das den öffentlichen Schlüssel enthält – pedrofb

Verwandte Themen