Digitale handtekeningen gebruiken voor gegevensintegriteitscontrole in Linux
Inleiding
Een van de belangrijkste vragen in de wereld van vandaag is de kwestie van vertrouwen in ontvangen gegevens. Gebruiker А stuurt bijvoorbeeld gegevens D naar gebruiker B via e-mail. Hoe kan gebruiker B er zeker van zijn dat de ontvangen gegevens dezelfde gegevens zijn die door gebruiker A zijn verzonden? Een mogelijke manier om dit probleem op te lossen is het gebruik van een digitale handtekening (DS). De volgende vereisten zijn van toepassing op een DS:
De inhoud van de handtekening moet afhangen van het ondertekende bericht;
De unieke informatie van de afzender moet worden gebruikt in een handtekening;
Het zou gemakkelijk moeten zijn om een handtekening te maken;
Het zou onmogelijk moeten zijn om een handtekening rekenkundig te vervalsen;
Een handtekening moet klein zijn.
In dit artikel wordt een voorbeeld van een DS-implementatie besproken voor het controleren van de integriteit van binaire bestanden in Linux (64-bits ELF). We zullen een directe DS gebruiken wanneer alleen een afzender en een ontvanger communiceren (zonder een derde partij/arbiter). Hiervoor hebben we een private encryptiesleutel en een publieke sleutel (certificaat) nodig. De afzender maakt beide sleutels aan. Gebruiker A tekent een uitvoerbaar bestand en geeft het certificaat door aan gebruiker B met behulp van veilige aflevermiddelen. Hierna stuurt gebruiker A een ondertekend bestand naar gebruiker B. Gebruiker B voert het ontvangen bestand uit; als het binaire bestand beschadigd is, ontvangt gebruiker B een bericht dat DS-verificatie is mislukt. Om deze oplossing te implementeren, hebben we een programma nodig voor het ondertekenen van binaire bestanden en een code die DS'en verifieert.
Voorbeeld van DS-implementatie
De implementatie van DS omvat de volgende stappen:
Genereren van binair MD5-bronbestand;
Het maken van twee sleutels:privé en openbaar (certificaat).
Binaire bestandsondertekening (ELF):
1 MD5 van het binaire bestand wordt versleuteld met behulp van de privésleutel;
3.2 De versleutelde MD5 wordt geschreven naar een nieuwe .sig sectie van het binaire bestand;
3.3 Het certificaat wordt opgeslagen in de map ~/.ssh.
Dit alles kan worden geïmplementeerd met behulp van de Linux-hulpprogramma's openssl, objcopy en md5sum. Hieronder vindt u een voorbeeld van een script sign_elf.sh dat ELF-binaire bestanden ondertekent. (Opmerking:bron zonder regelnummers staat aan het einde van dit artikel.)
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=Nizjni Novgorod/L=Nizjni Novgorod/O=Auriga/OU=DEV/CN=www.auriga.com"007 008 if [ "$#" ="0" ]; then009 echo "Gebruik:sign_elfs.sh ... "010 exit 1;011 fi012 013 if [ ! -d "$KEY_DIR"]; then014 # Controle komt hier binnen als $DIRECTORY niet bestaat.015 mkdir "$KEY_DIR"016 fi017 018 # Maak privésleutel en certificaat019 openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out " $CERTIFICATE" -days 365 -subj "$SUBJECT"020 021 voor 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_26.md5"0! -f "$ELF_BIN" ] || [ "x$ELF_BIN" ="x" ];then028 echo "Fout:geen dergelijk bestand $ELF_BIN"029 exit 1030 fi031 032 # Verwijder .sig section033 objcopy --remove-section=.sig "$ELF_BIN"034 035 # Toevoegen 512-byte sectie gevuld met nullen036 rm -f dummy.txt037 touch dummy.txt038 truncate --size=512 dummy.txt039 objcopy --add-section .sig=dummy.txt --set-section-flags .sig=noload, alleen-lezen "$ELF_BIN"040 041 # Maak MD5 hash042 md5sum "$ELF_BIN" | awk '{ print $1 }'> "$KEY_DIR/$ELF_BIN_MD5"043 044 # Versleutel de MD5-hash met de privésleutel045 openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$EL5" 046 047 # Valideer versleutelde MD5-hash met certificaat048 openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -handtekening "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN 050 #5" versleutelde MD5 hash in ELF binair in .sig sectie051 echo "Voeg .sig sectie toe"052 objcopy --update-section .sig="$KEY_DIR/$ELF_BIN_SIGNATURE" --set-section-flags .sig=noload,readonly "$ELF_BIN " "$ELF_BIN"053 054 # Print .sig section055 echo "Controleer .sig section"056 objdump -sj .sig "$ELF_BIN"057 done058 059 rm -f dummy.txt060 061 ls -ls ~/.ssh
Figuur 1. Het proces van het ondertekenen van ELF binair. (Bron:Auriga)
Laten we de details onderzoeken van wat dit script doet.
Lijn 19:
openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout “$PRIVATE_KEY” -out “$CERTIFICATE” -days 365 -subj “$SUBJECT”
req — verzoek om certificaat aan te maken
-nodes — maak een persoonlijke leesbare tekstsleutel
-x509 — output — zelfondertekend certificaat
-sha256 — coderingsalgoritme
-newkey rsa:4096 — maak een nieuw certificaat en RSA-privésleutel, aantal bits — 4096
-keyout $PRIVATE_KEY — het pad naar het bestand waar de privésleutel naar wordt geschreven
-out $CERTIFICATE — het pad naar het bestand waar het certificaat is geschreven tot-days 365 — aantal dagen voor certificaatbevestiging
-subj $SUBJECT — nieuw certificaatonderwerp (moet de indeling /type0=value0/type1=value1/type2=… hebben). In ons geval is dit /C=RU/ST=Nizjni Novgorod/L=Nizjni Novgorod/O=Auriga/OU=DEV/CN=www.auriga.com, waarbij
С — land
ST — staat, regio, provincie
L — locatie
O — organisatie
OU — organisatorische afdeling/eenheid
CN — basistitel/containernaam
Het onderwerp wordt in detail beschreven in RFC-5280 (https://tools.ietf.org/html/rfc5280). Nadat deze opdracht is uitgevoerd, wordt een privésleutel gegenereerd, ~/.ssh/priv.key en certificaat ~/.ssh/pub.crt. De privésleutel wordt gebruikt om de gegevens te versleutelen en het certificaat wordt gebruikt voor het ontsleutelen van gegevens. Met behulp van één privésleutel is het mogelijk om een aantal unieke certificaten te genereren voor het ontsleutelen van gegevens die met deze privésleutel zijn versleuteld.
Lijn 21:
voor ELF_BIN in $@; doen
Begin van lus voor alle binaire bestanden die zijn toegevoegd aan het sign_elf.sh-script.
Lijn 33:
objcopy –remove-section=.sig “$ELF_BIN”
Verwijder de .sig sectie uit ons binaire bestand. Dit moet worden uitgevoerd als het bestand al is ondertekend met ons script en we het opnieuw willen ondertekenen.
Lijnen 36+:
rm -f dummy.txt
touch dummy.txt
truncate –size=512 dummy.txt
objcopy –add-section .sig=dummy.txt –set -section-flags .sig=noload,alleen-lezen “$ELF_BIN
Maak een 512-byte tekstbestand en voeg het toe aan ons binaire bestand dat niet is geladen in de runtime .sig sectie alleen voor lezen, die gegevens uit het dummy.txt-bestand bevat.
Lijn 42:
md5sum “$ELF_BIN” | awk '{ print $1 }'> "$KEY_DIR/$ELF_BIN_MD5"
Bereken MD5 van het binaire bestand (met .sig sectie) en schrijf het resultaat naar een tekstbestand, binaire_naam.md5.
Lijn 45:
openssl dgst -sha256 -sign “$PRIVATE_KEY” -out “$KEY_DIR/$ELF_BIN_SIGNATURE” “$KEY_DIR/$ELF_BIN_MD5”
Deze opdracht versleutelt het bestand met MD5 gemaakt door regel 42 met een privésleutel. Argumenten:
dgst — deze optie geeft aan dat we gegevens willen versleutelen (tekenen);
-sha256 — coderingsalgoritme;
-teken $PRIVATE_KEY — versleutel het bestand met behulp van de privésleutel $PRIVATE_KEY;
-out $KEY_DIR/$ELF_BIN_SIGNATURE — versleutelde gegevens worden opgeslagen in bestand $KEY_DIR/$ELF_BIN_SIGNATURE;
$KEY_DIR/$ELF_BIN_MD5 — tekstbestand met gegevens die moeten worden versleuteld.
Lijn 48:
openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"
Ondertekende bestandsverificatie. Aan de hand van deze regel kan worden begrepen dat we voor DS-verificatie gecodeerde gegevens nodig hebben, een certificaat dat ons helpt bij het uitvoeren van verificatie en gegevensverificatie. Dat wil zeggen, als
x — versleutelde gegevens,
y — certificaat,
z — verificatiegegevens,
dan
f(x,y) =z
Lijn 52:
objcopy –update-section .sig=”$KEY_DIR/$ELF_BIN_SIGNATURE” –set-section-flags .sig=noload,readonly “$ELF_BIN” “$ELF_BIN”
Verwijder de oude .sig sectie en voeg een nieuwe toe aan het bestand $ELF_BIN (binaire_naam). Als gegevens voor de nieuwe .sig sectie, worden gegevens uit het ondertekende bestand $KEY_DIR/$ELF_BIN_SIGNATURE (~/.ssh/binary_name.sha256) gebruikt.
Internet of Things-technologie
- synergieën gebruiken voor een verbonden bedrijf
- Hoe u zich voorbereidt op AI met behulp van IoT
- Digital Twins kan de intelligente voorsprong zijn voor IoT in de productiesector – deel 2
- Onderhoud in de digitale wereld
- Is uw systeem klaar voor IoT?
- Digitale verzekeringen:5 digitale trends die de verzekeringssector vormgeven
- Western Digital introduceert nieuwe 3D NAND-producten voor IIoT
- Western Digital introduceert nieuwe 3D NAND-producten voor IIoT
- Voordelen van het gebruik van cloudcomputing voor het opslaan van IoT-gegevens
- Industrie 4.0-technologieën:tips voor het ontwikkelen van uw digitale strategie
- Neurale netwerken gebruiken voor snellere röntgenbeeldvorming