Kryptografische Hashfunktionen können zur Integritätsprüfung verwendet werden, um Änderungen in Daten festzustellen. Bitcoin verwendet kryptografische Hashfunktionen sehr ausgiebig, um zu überprüfen, dass sich Daten nicht geändert haben. Zum Beispiel wird immer ab und zu – durchschnittlich alle 10 Minuten – ein neuer Hash der gesamten Zahlungsgeschichte erzeugt. Wenn jemand versucht, diese Daten zu ändern, wird dies sofort von jedem, der die Hashes überprüft, bemerkt.
Grundlegenden Eigenschaften von Hash:
-Gleiche Eingabedaten erzeugen den gleichen Hash.
-Leicht unterschiedliche Eingabedaten erzeugen sehr unterschiedliche Hashes.
-Der Hash hat stets eine feste Länge. Bei SHA256 sind dies 256 Bits.
-Die Holzhammermethode Trial-and-Error ist der einzige bekannte Weg, einen Input zu finden, der einen bestimmten Hash erzeugt.
Hier mal ein kleines Java Beispiel mit unterschiedlichen Libs und pur Java: …
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
/** * Test von SHA-2 (von englisch secure hash algorithm, sicherer * Hash-Algorithmus) Hash. * * @author Thomas Wenzlaff * */ public class Start { private static String EINGABE = "Der Text von dem der Hash gebildet wird. Er soll auch mal ein paar Umlaute enthalten wie öü oder ÖÜ"; public static void main(String[] args) throws Exception { System.out.println("Der SHA-256 Hash ist 32 Byte (2 HEX Zeichen * 32 = 64) lang, d.h. 64 Zeichen"); // mit Java 8 MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hashJava = digest.digest(EINGABE.getBytes(StandardCharsets.UTF_8)); System.out.println("Der SHA-256 Hash mit Java java.security.MessageDigest : " + bytesToHex(hashJava)); // mit Google Guava Lib String hashGuava = Hashing.sha256().hashString(EINGABE, StandardCharsets.UTF_8).toString(); System.out.println("Der SHA-256 Hash mit Java com.google.guava : " + hashGuava); // mit Apache Lib String hashApache = DigestUtils.sha256Hex(EINGABE); System.out.println("Der SHA-256 Hash mit org.apache.commons.codec.digest.DigestUtils: " + hashApache); } |
Das Ergebnis:
1 2 3 4 |
Der SHA-256 Hash ist 32 Byte (2 HEX Zeichen * 32 = 64) lang, d.h. 64 Zeichen Der SHA-256 Hash mit Java java.security.MessageDigest : 9307f6730bb57a068c3662c775649c4fbadfb0ddf3d11c43e525259a43c1a150 Der SHA-256 Hash mit Java com.google.guava : 9307f6730bb57a068c3662c775649c4fbadfb0ddf3d11c43e525259a43c1a150 Der SHA-256 Hash mit org.apache.commons.codec.digest.DigestUtils: 9307f6730bb57a068c3662c775649c4fbadfb0ddf3d11c43e525259a43c1a150 |
Das ganze Testprojekt, kann von Bitbucket geklont werden mit:
git clone https://itberater@bitbucket.org/itberater/twhash.git
Und nicht vergessen, beim Passwort hashing, nicht das salzen für jeden User vergessen, da viele User die gleichen Passwörter verwenden und auch weil Salz bei Glatteis hilf 😉 Oder gleich SSO von bekannten Diensten verwenden.