Java Cryptography - tworzenie podpisu
Podpisy cyfrowe pozwalają nam zweryfikować autora, datę i godzinę podpisów, uwierzytelnić treść wiadomości. Zawiera również funkcję uwierzytelniania dla dodatkowych możliwości.
Zalety podpisu cyfrowego
W tej sekcji poznamy różne powody, dla których warto używać podpisu cyfrowego. Istnieje kilka powodów, dla których warto wdrożyć podpisy cyfrowe w komunikacji -
Poświadczenie
Podpisy cyfrowe pomagają uwierzytelniać źródła wiadomości. Na przykład, jeśli oddział banku wysyła wiadomość do centrali z prośbą o zmianę salda na rachunku. Jeżeli centrala nie mogłaby uwierzytelnić, że wiadomość została wysłana z autoryzowanego źródła, wykonanie takiego wniosku mogłoby być poważnym błędem.
Integralność
Gdy wiadomość zostanie podpisana, każda zmiana w wiadomości spowoduje unieważnienie podpisu.
Niezaprzeczalność
Dzięki tej właściwości żaden podmiot, który podpisał pewne informacje, nie może później zaprzeczyć, że je podpisał.
Tworzenie podpisu cyfrowego
Nauczmy się teraz, jak utworzyć podpis cyfrowy. Możesz utworzyć podpis cyfrowy za pomocą Java, postępując zgodnie z instrukcjami podanymi poniżej.
Krok 1: Utwórz obiekt KeyPairGenerator
Plik KeyPairGenerator klasa zapewnia getInstance() , która akceptuje zmienną String reprezentującą wymagany algorytm generowania kluczy i zwraca obiekt KeyPairGenerator, który generuje klucze.
Stwórz KeyPairGenerator obiekt za pomocą getInstance() metoda, jak pokazano poniżej.
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
Krok 2: Zainicjuj obiekt KeyPairGenerator
Plik KeyPairGenerator class udostępnia metodę o nazwie initialize()ta metoda służy do inicjalizacji generatora par kluczy. Ta metoda akceptuje wartość całkowitą reprezentującą rozmiar klucza.
Zainicjuj obiekt KeyPairGenerator utworzony w poprzednim kroku przy użyciu initialize() metoda, jak pokazano poniżej.
//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);
Krok 3: Wygeneruj KeyPairGenerator
Możesz wygenerować plik KeyPair używając generateKeyPair()metoda. Wygeneruj parę kluczy przy użyciugenerateKeyPair() metoda, jak pokazano poniżej.
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
Krok 4: Uzyskaj klucz prywatny z pary
Możesz uzyskać klucz prywatny z wygenerowanego obiektu KeyPair przy użyciu getPrivate() metoda.
Uzyskaj klucz prywatny za pomocą getPrivate() metoda, jak pokazano poniżej.
//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();
Krok 5: Utwórz obiekt podpisu
Plik getInstance() metoda Signature class akceptuje parametr ciągu reprezentujący wymagany algorytm podpisu i zwraca odpowiedni obiekt Signature.
Utwórz obiekt klasy Signature przy użyciu rozszerzenia getInstance() metoda.
//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withDSA");
Krok 6: Zainicjuj obiekt Signature
Plik initSign() metoda klasy Signature akceptuje plik PrivateKey obiekt i inicjalizuje bieżący obiekt Signature.
Zainicjuj obiekt Signature utworzony w poprzednim kroku przy użyciu initSign() metoda, jak pokazano poniżej.
//Initialize the signature
sign.initSign(privKey);
Krok 7: Dodaj dane do obiektu Signature
Plik update() metoda klasy Signature akceptuje tablicę bajtów reprezentującą dane do podpisania lub weryfikacji i aktualizuje bieżący obiekt podanymi danymi.
Zaktualizuj zainicjowany obiekt Signature, przekazując dane do podpisania do pliku update() metoda w postaci tablicy bajtów, jak pokazano poniżej.
byte[] bytes = "Hello how are you".getBytes();
//Adding data to the signature
sign.update(bytes);
Krok 8: Oblicz podpis
Plik sign() metoda Signature class zwraca bajty sygnatur zaktualizowanych danych.
Oblicz podpis za pomocą sign() metoda, jak pokazano poniżej.
//Calculating the signature
byte[] signature = sign.sign();
Example
Poniższy program Java akceptuje wiadomość od użytkownika i generuje podpis cyfrowy dla tej wiadomości.
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.Signature;
import java.util.Scanner;
public class CreatingDigitalSignature {
public static void main(String args[]) throws Exception {
//Accepting text from user
Scanner sc = new Scanner(System.in);
System.out.println("Enter some text");
String msg = sc.nextLine();
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
//Initializing the key pair generator
keyPairGen.initialize(2048);
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();
//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withDSA");
//Initialize the signature
sign.initSign(privKey);
byte[] bytes = "msg".getBytes();
//Adding data to the signature
sign.update(bytes);
//Calculating the signature
byte[] signature = sign.sign();
//Printing the signature
System.out.println("Digital signature for given text: "+new String(signature, "UTF8"));
}
}
Output
Powyższy program generuje następujące dane wyjściowe -
Enter some text
Hi how are you
Digital signature for given text: 0=@gRD???-?.???? /yGL?i??a!?