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ć:
- Klasyczny wiersz poleceń Windows. (Jak uruchomić wiersz polecenia w Windows 7 i 10).
- Wiersz poleceń PowerShell (Jak uruchomić PowerShell w Windows 7 i 10?)
- Klasa Java
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.
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);
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):
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()
).