Prime Root Hash ist ein kryptographisches Hash-Verfahren. Damit können sichere Fingerabdrücke zum Speichern und Vergleichen von Passwörtern erzeugt werden, zum Kodieren von Zugängen und weitere Absicherungen.
Prime Root Hash ist Bestandteil der Design-Utils und im Intersult Maven Repository erhältlich.
Trapdoor-Funktionen sind mathematisch in eine Richtung einfach zu berechnen, in die andere Richtung allerdings schwierig. Prime Roots, also Primitivwurzeln basieren auf der Schwierigkeit, einen Logarithmus aus einer großen Zahl zu ziehen.
Die komfortable Crypt-Klasse erzeugt dabei wieder eine Zeichenkette, die für URLs, Dateinamen und Passwörter verwendet werden kann. Dabei kommen die Zeichen com.intersult.util.string.StringUtils.DISTINGUISHABLE zum Einsatz. Dabei handelt es sich um eine Auswahl von Zeichen, die auch bei manueller Eingabe leicht zu unterscheiden sind.
Crypt crypt = new Crypt("some-key"); String hash = crypt.hash("some-password-to-encrypt"); boolean equal = hash.equals(crypt.hash(someUserEnteredPassword));
Erklärung:
String | Hash-Wert |
---|---|
Hallöchen | baySkPjELI5H74rGY6myXZ |
Hallöchen! | bfXmVy7RkdW0CkE7QuQYVE |
Hellöchen | 7K2tzDXmn699S9uWW7BWqj |
Erklärung: Es wurden absichtlich recht ähnliche Strings benutzt um zu zeigen, dass sich die Hash-Werte stark unterscheiden.
Diese Klasse verkapselt Methoden aus der Klasse com.intersult.util.math.Num, insbesondere nextProbablePrimeRoot(int bits). Damit kann nun letzten Endes das gewünschte Object vom Typ PrimeRoot erzeugt werden, das eine Primzahl und eine zugehörige Primitivwurzel enthält. Beide Zahlen sind vom Typ java.math.BigInteger.
Das Überprüfen ob eine Zahl eine Primitivwurzel einer Primzahl ist, ist selbst mit optimierten Algorithmen relativ aufwendig zu berechnen. Daher sind derzeit Primitivwurzeln bis zu 84 Bit Länge orab gespeichert.
Hinweis: Die Implementierung ist nur effizient für relativ kleine Byte-Arrays, nicht wesentlich größer als 1024 Bytes.
Warnung: Bei der Anfrage längerer Primitivwurzeln werden diese berechnet. Dies kann mit zunehmender Bit-Länge sehr viel Zeit in Anspruch nehmen.