Überprüfen Sie PKCS # 7 (PEM) Signatur / entpacken Sie Daten in node.js

8

Ich bekomme ein PKCS # 7 Crypto-Paket von einem Drittanbieter-System. Das Paket ist nicht komprimiert und nicht verschlüsselt, PEM-codiert, mit X.509-Zertifikat signiert. Ich habe auch eine PEM-Cert-Datei vom Anbieter.

Die Daten darin sind XML

Ich muss Folgendes in Node.JS tun:

  • Extrahiere die Daten
  • Verifiziere die Signatur

Ein Beispielpaket (keine sensiblen Daten, Daten beziehen sich auf unser qa-System) Ссылка

    
Guard 12.04.2013, 11:04
quelle

2 Antworten

3

Ihre Antwort ist ein großer Schritt in die richtige Richtung. Sie verpassen jedoch einen wesentlichen Teil der Validierung!

Sie sollten den Hash der Daten anhand des Digests überprüfen, der in den signierten Attributen enthalten ist. Anderenfalls wäre es möglich, den Inhalt durch schädliche Daten zu ersetzen. Versuchen Sie zum Beispiel, das folgende "Paket" mit Ihrem Code zu validieren (und sehen Sie sich den Inhalt an): Ссылка

Ich bin kein großer Entwickler von NodeJS (das ist mein erster Versuch: p), aber hier ist ein Vorschlag, der Ihnen den Einstieg erleichtert.

%Vor%     
qistoph 22.04.2013, 19:06
quelle
6

OK, endlich verstanden.

Erstens sind PKCS-Nachrichten komplexe Strukturen, die mit ASN1 binär codiert sind.

Zweitens können sie in Binärdateien ( DER-Codierung ) oder Text-PEM-Dateien mit Base64 Codierung.

Drittens spezifiziert das PKCS # 7-Format mehrere Pakettypen, von denen mein Name signierte Daten heißt. Diese Formate unterscheiden sich durch den OBJECT IDENTIFIER-Wert am Anfang des ASN1-Objekts (1. Element der Wrapper-Sequenz) - Sie können zu Ссылка wechseln und fügen Sie den Pakettext für die vollständig analysierte Struktur ein.

Als nächstes müssen wir das Paket analysieren (Base64 - & gt; ASN1 - & gt; irgendeine Objektdarstellung). Leider gibt es dafür kein npm-Paket. Ich fand ein ziemlich gutes Projekt schmieden , das nicht in der npm-Registry veröffentlicht wurde (obwohl npm-kompatibel). Es hat das PEM-Format analysiert, aber der resultierende Baum ist ziemlich unangenehm. Basierend auf ihren Implementierungen für verschlüsselte Daten und umhüllte Daten habe ich Teilimplementierungen signierter Daten in meinem eigenen Fork erstellt. UPD: Meine Pull-Anfrage wurde später mit dem Schmiedeprojekt zusammengeführt.

Jetzt haben wir endlich das Ganze geparst. An diesem Punkt fand ich einen großartigen (und wahrscheinlich einzigen im gesamten Internet) erklärenden Artikel über die verifizierte PKCS # 7 Verifikation: Ссылка

Ich konnte die Signatur aus der Datei extrahieren und erfolgreich dekodieren, aber der darin enthaltene Hash unterschied sich vom Hash der Daten. Gott segne Chris, der erklärt was tatsächlich passiert.

Der Datensignierprozess erfolgt in zwei Schritten:

  1. Der Hashwert des ursprünglichen Inhalts wird berechnet
  2. Eine Reihe von "Autorisierten Attributen" wird erstellt, einschließlich: Typ der gesagten Daten, Signierzeit und Datenhash

Dann wird die Menge aus Schritt 2 mit dem privaten Schlüssel des Unterzeichners signiert.

Aufgrund von PKCS # 7-Spezifika wird dieser Satz von Attributen innerhalb des kontextspezifisch konstruierten Typs (class = 0x80, type = 0) gespeichert, sollte jedoch als normaler SET (Klasse = 0, type = 17) signiert und validiert werden. .

Wie Chris erwähnt ( Ссылка ), wird nur überprüft, ob die Attribute im Paket gültig sind. Wir sollten auch den tatsächlichen Datenhash gegen das Digest-Attribut validieren.

Also, hier ist ein Code, der die Validierung durchführt ( cert.pem ist eine Zertifikatsdatei, die der Provider mir geschickt hat, package ist eine PEM-codierte Nachricht, die ich von ihnen über HTTP POST erhalten habe):

%Vor%     
Guard 23.05.2017 10:29
quelle

Tags und Links