Biometrische Anmeldung (webauthn) in Go, wie Signatur zu überprüfen

8

Mit dem jüngsten Windows Anniversary-Update unterstützt Edge nun die biometrische Authentifizierung mit Windows Hello (siehe Ссылка , Ссылка )

Ich habe einige Beispiele in C #, PHP und Node.js und versuche, es in Go funktionieren zu lassen.

Folgendes funktioniert in JS (Ich habe die Challenge und den Schlüssel fest codiert):

%Vor%

In go habe ich den folgenden Code, der dem obigen JS-Code entsprechen soll (req ist eine Struktur mit Strings aus einem JSON-Anfragetext):

%Vor%

Dieser Code schlägt mit crypto/rsa: input must be hashed message fehl. Wenn ich hash[:] anstelle von b in rsa.VerifyPKCS1v15 ändere, schlägt es mit crypto/rsa: verification error fehl. Ich glaube, ich muss authenticatorData und hash kombinieren, weil dies in den C # - und PHP-Beispielcodes geschieht (vgl. Ссылка , Ссылка ).

Vielleicht geht es anders?

Ich habe die Byte-Arrays in JS und Go gedruckt und verifiziert, dass clientData , signatureData , authenticatorData und hash (und das kombinierte Array der letzten beiden) genau die gleichen Werte haben. Ich konnte die n- und e-Felder nach dem Erstellen des öffentlichen Schlüssels nicht aus JS extrahieren, daher könnte es ein Problem bei der Erstellung des öffentlichen Schlüssels geben.

    
yngling 14.08.2016, 08:26
quelle

1 Antwort

2

Ich bin kein Crypto-Experte, aber ich habe einige Erfahrung in Go, einschließlich der Überprüfung von Signaturen, die mit PHP signiert wurden. Unter der Annahme, dass die verglichenen Bytewerte gleich sind, würde ich sagen, dass Ihr Problem wahrscheinlich die Erstellung eines öffentlichen Schlüssels ist. Ich würde vorschlagen, meine Lösung zu versuchen, öffentliche Schlüssel aus Modulus und Exponent mit dieser Funktion zu erstellen:

%Vor%

Ich habe meinen öffentlichen Schlüssel und Deinen ( Spielplatz ) verglichen und sie haben unterschiedliche Werte. Könnten Sie mir bitte Feedback zu der Lösung geben, die ich mit Ihrem Code vorgeschlagen habe, wenn es funktioniert?

Bearbeiten 1 : URLEncoding-Beispiel Spielplatz 2

Edit 2 : So prüfe ich die Signatur:

%Vor%

Also ist die Variable 'data' im Snippet von Edit 2 dieselbe Daten (Nachricht), die für das Signieren auf PHP-Seite verwendet wurde.

    
kingSlayer 04.09.2016 23:41
quelle