Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial Internet of Things >> Internet der Dinge-Technologie

Verwenden digitaler Signaturen zur Datenintegritätsprüfung unter Linux

Einführung

Eine der wichtigsten Fragen in der heutigen Welt ist die Frage des Vertrauens in empfangene Daten. Zum Beispiel sendet Benutzer А Daten D per E-Mail an Benutzer B. Wie kann Benutzer B sicher sein, dass die empfangenen Daten dieselben Daten sind, die von Benutzer A gesendet wurden? Eine Möglichkeit, dieses Problem zu beheben, ist die Verwendung einer digitalen Signatur (DS). Die folgenden Anforderungen gelten für einen DS:

Dieser Artikel betrachtet ein DS-Implementierungsbeispiel für die Integritätsprüfung von Binärdateien in Linux (64-Bit-ELF). Wir verwenden eine direkte DS, wenn nur ein Absender und ein Empfänger kommunizieren (ohne einen Dritten/einen Schlichter). Dazu benötigen wir einen privaten Verschlüsselungsschlüssel und einen öffentlichen Schlüssel (Zertifikat). Der Absender erstellt beide Schlüssel. Benutzer A signiert eine ausführbare Datei und übergibt das Zertifikat mit Hilfe eines sicheren Liefermediums an Benutzer B. Danach sendet Benutzer A eine signierte Datei an Benutzer B. Benutzer B führt die empfangene Datei aus; Wenn die Binärdatei beschädigt ist, erhält Benutzer B eine Nachricht, dass die DS-Überprüfung fehlgeschlagen ist. Um diese Lösung zu implementieren, benötigen wir ein Programm zum Signieren von Binärdateien und einen Code, der DSs verifiziert.

DS-Implementierungsbeispiel

Die DS-Implementierung umfasst die folgenden Schritte:

  1. MD5-Quellbinärdateigenerierung;

  2. Die Erstellung von zwei Schlüsseln:privat und öffentlich (Zertifikat).

  3. Binary File Signing (ELF):
    1 MD5 der Binärdatei wird mit Hilfe des privaten Schlüssels verschlüsselt;
    3.2 ​​Das verschlüsselte MD5 wird in eine neue .sig geschrieben Abschnitt der Binärdatei;
    3.3 Das Zertifikat wird im Ordner ~/.ssh gespeichert.

All dies kann mit Hilfe der Linux-Dienstprogramme openssl, objcopy und md5sum implementiert werden. Unten finden Sie ein Beispiel für ein Skript sign_elf.sh, das ELF-Binärdateien signiert. (Hinweis:Quelle ohne Zeilennummern ist am Ende dieses Artikels enthalten.)

001 #!/bin/bash002 003 KEY_DIR="$HOME/.ssh"004 PRIVATE_KEY="$KEY_DIR/priv.key"005 CERTIFICATE="$KEY_DIR/pub.crt"006 SUBJECT="/C=RU /ST=Nischni Nowgorod/L=Nischni Nowgorod/O=Auriga/OU=DEV/CN=www.auriga.com"007 008 if [ "$#" ="0"]; then009 echo "Verwendung:sign_elfs.sh ... "010 exit 1;011 fi012 013 if [ ! -d "$KEY_DIR" ]; then014 # Control wird hier eingetragen, wenn $DIRECTORY nicht existiert.015 mkdir "$KEY_DIR"016 fi017 018 # Private Key und Zertifikat erstellen019 openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out " $CERTIFICATE" -days 365 -subj "$SUBJECT"020 021 für ELF_BIN in $@; do022 ELF_BASE_NAME="${ELF_BIN##*/}"023 # ELF_BIN_OLD="$ELF_BIN.old"024 ELF_BIN_SIGNATURE="$ELF_BASE_NAME.sha256"025 ELF_BIN_MD5="$ELF_BASE_NAME.md5"026 027 wenn [ ! -f "$ELF_BIN" ] || [ "x$ELF_BIN" ="x" ];then028 echo "Fehler:keine solche Datei $ELF_BIN"029 exit 1030 fi031 032 # .sig Abschnitt033 entfernen objcopy --remove-section=.sig "$ELF_BIN"034 035 # Hinzufügen 512-Byte-Abschnitt gefüllt mit Nullen036 rm -f dummy.txt037 touch dummy.txt038 truncate --size=512 dummy.txt039 objcopy --add-section .sig=dummy.txt --set-section-flags .sig=noload, readonly "$ELF_BIN"040 041 # MD5 hash042 erstellen md5sum "$ELF_BIN" | awk '{ print $1 }'> "$KEY_DIR/$ELF_BIN_MD5"043 044 # MD5-Hash mit privatem Schlüssel verschlüsseln045 openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$MD5"_ 046 047 # Verschlüsselten MD5-Hash mit dem Zertifikat validieren048 openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN 0_MD5" .0 verschlüsselter MD5-Hash in ELF-Binärdatei in .sig-Abschnitt051 echo ".sig-Abschnitt hinzufügen"052 objcopy --update-section .sig="$KEY_DIR/$ELF_BIN_SIGNATURE" --set-section-flags .sig=noload,readonly "$ELF_BIN " "$ELF_BIN"053 054 # Print .sig Abschnitt055 echo "Check .sig Abschnitt"056 objdump -sj .sig "$ELF_BIN"057 done058 059 rm -f dummy.txt060 061 ls -ls ~/.ssh


Abbildung 1. Der Prozess des Signierens von ELF-Binärdateien. (Quelle:Auriga)

Lassen Sie uns die Details dieses Skripts untersuchen.

Zeile 19:

openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out "$CERTIFICATE" -days 365 -subj "$SUBJECT"

req — Anforderung zur Zertifikatserstellung

-nodes — erstellt einen privaten Klartextschlüssel

-x509 — Ausgabe — Selbstsigniertes Zertifikat

-sha256 — Verschlüsselungsalgorithmus

-newkey rsa:4096 — Erstellen Sie ein neues Zertifikat und einen privaten RSA-Schlüssel, Anzahl der Bits — 4096

-keyout $PRIVATE_KEY — der Pfad zu der Datei, in die der private Schlüssel geschrieben wird

-out $CERTIFICATE — der Pfad zu der Datei, in die das Zertifikat geschrieben wird heute 365 — Anzahl der Tage für die Zertifikatsbestätigung

-subj $SUBJECT — neuer Zertifikatssubjekt (sollte das Format /type0=value0/type1=value1/type2=… haben). In unserem Fall ist dies /C=RU/ST=Nizhni Novgorod/L=Nizhniy Novgorod/O=Auriga/OU=DEV/CN=www.auriga.com, wobei
     С — Land
     ST — Bundesstaat, Region, Provinz
     L — Standort
     O — Organisation
     OU — Abteilung/Einheit der Organisation
     CN — Grundbezeichnung/Containername

Das Thema ist im RFC-5280 (https://tools.ietf.org/html/rfc5280) ausführlich beschrieben. Nachdem dieser Befehl ausgeführt wurde, wird ein privater Schlüssel generiert, ~/.ssh/priv.key und das Zertifikat ~/.ssh/pub.crt. Der private Schlüssel wird zum Verschlüsseln der Daten verwendet und das Zertifikat wird zur Datenentschlüsselung verwendet. Mit einem privaten Schlüssel ist es möglich, mehrere eindeutige Zertifikate zum Entschlüsseln von Daten zu generieren, die mit diesem privaten Schlüssel verschlüsselt wurden.

Zeile 21:

für ELF_BIN in $@; tun

Beginn der Schleife für alle Binärdateien, die dem sign_elf.sh-Skript hinzugefügt wurden.

Zeile 33:

objcopy –remove-section=.sig „$ELF_BIN“

Entfernen Sie die .sig Abschnitt aus unserer Binärdatei. Dies muss durchgeführt werden, wenn die Datei bereits mit unserem Skript signiert wurde und wir sie erneut signieren möchten.

Zeilen 36+:

rm -f dummy.txt
touch dummy.txt
truncate –size=512 dummy.txt
objcopy –add-section .sig=dummy.txt –set -section-flags .sig=noload,readonly „$ELF_BIN

Erstellen Sie eine 512-Byte-Textdatei und fügen Sie sie unserer Binärdatei hinzu, die nicht in der Laufzeit .sig geladen ist Abschnitt nur zum Lesen, der Daten aus der Datei dummy.txt enthält.

Zeile 42:

md5sum „$ELF_BIN“ | awk '{ print $1 }'> "$KEY_DIR/$ELF_BIN_MD5"

MD5 der Binärdatei berechnen (mit .sig Abschnitt) und schreiben Sie das Ergebnis in eine Textdatei, binary_name.md5.

Zeile 45:

openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"

Dieser Befehl verschlüsselt die in Zeile 42 erstellte Datei mit MD5 mit einem privaten Schlüssel. Argumente:

dgst — diese Option zeigt an, dass wir Daten verschlüsseln (signieren) möchten;

-sha256 — Verschlüsselungsalgorithmus;

-sign $PRIVATE_KEY — verschlüssele die Datei mit Hilfe des privaten Schlüssels $PRIVATE_KEY;

-out $KEY_DIR/$ELF_BIN_SIGNATURE — verschlüsselte Daten werden in der Datei $KEY_DIR/$ELF_BIN_SIGNATURE gespeichert;

$KEY_DIR/$ELF_BIN_MD5 — Textdatei mit zu verschlüsselnden Daten.

Zeile 48:

openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"

Überprüfung der signierten Datei. Unter Bezugnahme auf diese Zeile ist zu verstehen, dass wir für die DS-Verifizierung verschlüsselte Daten benötigen, ein Zertifikat, das uns bei der Überprüfung und Datenüberprüfung hilft. Das heißt, wenn

x — verschlüsselte Daten,
y — Zertifikat,
z — Verifizierungsdaten,

dann

f(x,y) =z

Zeile 52:

objcopy –update-section .sig=“$KEY_DIR/$ELF_BIN_SIGNATURE“ –set-section-flags .sig=noload,readonly „$ELF_BIN“ „$ELF_BIN“

Entfernen Sie die alte .sig Abschnitt und fügen Sie der Datei $ELF_BIN (binary_name) einen neuen hinzu. Als Daten für die neue .sig Abschnitt werden Daten aus der signierten Datei $KEY_DIR/$ELF_BIN_SIGNATURE (~/.ssh/binary_name.sha256) verwendet.


Internet der Dinge-Technologie

  1. Synergien für ein verbundenes Unternehmen nutzen
  2. Wie Sie sich auf KI mit IoT vorbereiten
  3. Digitale Zwillinge können der intelligente Vorsprung für das IoT im Fertigungssektor sein – Teil 2
  4. Wartung in der digitalen Welt
  5. Ist Ihr System bereit für IoT?
  6. Digital Insurance:5 digitale Trends, die die Versicherungsbranche prägen
  7. Western Digital stellt neue 3D-NAND-Produkte für das IIoT vor 
  8. Western Digital stellt neue 3D-NAND-Produkte für das IIoT vor 
  9. Vorteile der Verwendung von Cloud Computing zum Speichern von IoT-Daten
  10. Industrie 4.0-Technologien:Tipps zur Entwicklung Ihrer digitalen Strategie