Jak sprawdzić MD5 / SHA?

Co to jest MD5?

MD5 (Message-Digest algorithm 5) – algorytm generujacy 128 bitowy skrót z ciągu danych o dowolnej długości.

Więcej informacji o MD5.

Co to jest SHA

SHA (Secure Hash Algorithm) to grupa skrótów generujących skróty z wiadomości.

Więcej informacji o SHA.

Do grupy SHA należą;

  • SHA = SHA-0 – został wycofany
  • SHA-1 – został wycofany i nie powinien być używany
  • SHA-2 to grupa algorytmów:
    • SHA-224 (rozmiar danych: 264-1 bitów)
    • SHA-256 (rozmiar danych: 264-1 bitów)
    • SHA-384 (rozmiar danych: 2128-1 bitów)
    • SHA-512 (rozmiar danych: 2128-1 bitów)

Jeżeli skrót został określony współcześnie jako SHA jest to domyślnie SHA-256.

Cyfry po SHA np. -256 określają długość skrótu w bitach.

We współczesnym Internecie powinno stosować się algorytmy z rodziny SHA-2.

Do czego używa się skrótów?

Algorytmy MD5 i SHA są stosowane powszechnie w kryptografii. W interesujących nas zastosowaniach dla danej tabeli danych (byte[]) przy użyciu, któregoś z wymienionych algorytmów obliczany jest skrót.

Dla tablicy danych – oznacza, że również dla wszelkich danych, które dadzą się w taką tablicę zamienić, np. string (łańcuch znaków), obiekt Java, plik o dowolnymm rozszerzeniu, etc.)

Jeśli w Internecie widzisz plik do ściągnięcia i obok skrót to ściągasz plik i kopiujesz skrót SHA.

Na swoim komputerze generujesz skrót SHA dla tego pliku i porównujesz ze skrótem skopiowanym z internetu.

Jeżeli skróty się zgadzają, to znaczy, że plik nie został zmieniony.

Jeżeli skróty się nie zgadzają to znaczy, że plik mógł być uszkodzony podczas transportu, czy w inny sposób (celowo) zmieniony.

Jak wygenerować skrót MD5 / SHA w Windows 7 / 10?

Do wygenerowania skrótu w Windows może służyć:

Materiały

Ze strony https://gluonhq.com/products/javafx/ (Rys. 199)
ściągamy plik openjfx-12.0.2_windows-x64_bin-sdk.zip oraz kopiujemy skrót SHA (czyli skrót SHA-256). To będzie nasz plik do zbadania.

rys199
Rys. 199. Co ściągnąć?

Ja umieściłam plik openjfx-12.0.2_windows-x64_bin-sdk.zip w folderze C:/java.

Skrót SHA-256: 5b29930518b3e8eb01c206222fd5347c45b236fdd933db4540a7362488831bd9
openjfx-12.0.2_windows-x64_bin-sdk.zip

Klasyczny wiersz poleceń

Uruchamiamy wiersz polecenia.

Wpisujemy polecenie i klikamy ENTER (Rys. 200);

rys200
Rys. 200 Skrót SHA-256 dla pliku przy użyciu polecenia certutil

Jak widzimy skróty się zgadzają – plik jest identyczny z oryginalnym plikiem.

Polecenie obsługuje algorytmy MD5, SHA256, SHA384, SHA512 i niektóre starsze. Wystarczy zmienić nazwę algorytmu w poleceniu.

PowerShell

Uruchamiamy okno PowerShell.

Wpisujemy polecenie i klikamy Enter (Rys. 201):

rys201
Rys. 201 Skrót SHA-256 dla pliku przy użyciu PowerShell

Jak widzimy skróty się zgadzają – plik jest identyczny z oryginalnym plikiem.

Polecenie obsługuje algorytmy MD5, SHA256, SHA384, SHA512 i niektóre inne. Wystarczy zmienić nazwę algorytmu w poleceniu.

Klasa Java

HashGenerator.java
package crypto.hashs;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class HashGenerator {
    private MessageDigest digest;
    private byte[] hash;
    private String hashHex;

    public HashGenerator(String pathToFile, String algorytm) {
        try {
            digest = MessageDigest.getInstance(algorytm);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        try {
            hash = digest.digest(Files.readAllBytes(Paths.get(pathToFile)));
        } catch (IOException e) {
            e.printStackTrace();
        }
        hashHex = toHex(hash);
    }

    public String getHashHex() {
        return hashHex;
    }

    private static String toHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02X", b));
        }
        return sb.toString();
    }
}
Main.java
package crypto.hashs;

public class Main {
    public static void main(String[] args) {
        HashGenerator h = new HashGenerator("c:/java/openjfx-12.0.2_windows-x64_bin-sdk.zip", "SHA-256");
        System.out.println(h.getHashHex());
    }
}
Wynik

Po uruchomieniu klasy Main na konsoli widzimy:

5B29930518B3E8EB01C206222FD5347C45B236FDD933DB4540A7362488831BD9

Jak widzimy jest to dokładnie taki sam skrót jak obliczony przy użyciu narzędzi Windows.

Gdybys chciał/a utworzyć skrót dla np. stringu to konstrukcję
Files.readAllBytes(Paths.get(pathToFile)) należy zastąpić tablicą bajtów (np.
"ss".getBytes()).