
Podpis pliku to po prostu zaszyfrowanie skrótu pliku za pomocą klucza prywatnego. Weryfikacja to będzie odszyfrowanie za pomocą klucza publicznego i sprawdzenie czy skrót się zgadza ze skrótem otrzymanego pliku.
Krok po kroku
Załóżmy, że mamy plik document.pdf i chcemy go podpisać a później zweryfikować. Wykorzystamy do tego gotowe już klucze: publiczny (public_key.pem) i prywatny (private_key.pem).
Podpis
1. Skrót (hash) pliku
Na początku musimy stworzyć skrót podpisywanego pliku – ponieważ klucze publiczne i prywatne nie pozwalają na zaszyfrowanie zbyt długich ciągów bitów:
openssl dgst -sha256 -out document.sha256 document.pdfDo stworzenie skrótu został użyty algorytm sha256 (jest to informacja, którą powinien otrzymać odbiorca podpisu, aby móc samemu wygenerować skrót na podstawie otrzymanego pliku i porównać z tym otrzymanym).
2. Podpis (czyli zaszyfrowanie kluczem prywatnym)
Teraz należy po prostu zaszyfrować plik skrótu (document.sha256) kluczem prywatnym:
openssl rsautl -sign -inkey private_key.pem -keyform PEM -in document.sha256 -out document.signaturePlik document.signature zawiera podpis skrótu.
Weryfikacja
Weryfikacja będzie wymagała trzech elementów:
– pliku podpisanego – document.pdf
– pliku podpisu (skrótu pliku) – document.signature
– algorytmu użytego do stworzenia skrótu – sha256
– klucza publicznego podpisującego – public_key.pem
1. Odszyfrowanie pliku skrótu
Mając te wszystkie elementy, możemy przejść do weryfikacji. Krokiem pierwszym będzie odszyfrowanie skrótu za pomocą klucza publicznego:
openssl rsautl -verify -inkey public_key.pem -keyform PEM -pubin -in document.signature -out document.sha256.verifyOtrzymaliśmy plik document.sha256.verify posiadający odszyfrowany skrót.
2. Tworzenie skrótu z otrzymanego pliku
Teraz należy stworzyć skrót z otrzymanego pliku (document.pdf) za pomocą znanego algorytmu – sha256:
openssl dgst -sha256 -out document.sha256.received.verify document.pdf3. Porównanie skrótów
W końcu należy porównać obydwa skróty (przykładowo używając polecenia diff):
diff document.sha256.received.verify document.sha256.verifyJeśli są takie same, to możemy uznać weryfikacją za pozytywną.
