2016-04-02 3 views
2

Ich sah diesen folgenden Code.verwendet die java.util.UUID nach Hashing mit MD5 eine gute Option?

. 
. // some code 
. 
String guid = NetworkUtil.md5(java.util.UUID.randomUUID().toString()) 
. 
. // guid is being used 
. 

Ist dies ein guter Ansatz, hashing ein Version 4 UUID mit MD5?

Laut UUID-Spezifikation ist UUID selbst sehr gut in der Eindeutigkeit der generierten UUIDs und die Chancen auf Kollision sind sehr sehr sehr klein. Also ist es nicht das obige Stück Code, das die Qualität der Eindeutigkeit tatsächlich reduziert, indem es mit MD5 hasht, was jetzt ein veralteter Hash-Mechanismus ist und anfällig für Kollisionen und Angriffe ist.

+1

Eine zufällige Eingabe über eine Hash-Funktion zu übergeben, ist gleichbedeutend damit, dass nur einmal zufällige Eingaben erhalten werden. –

+1

Übrigens ist dieser Variablenname 'guid' eine falsche Bezeichnung. Ein [GUID - Globally Unique Identifier] (https://en.wikipedia.org/wiki/Globally_unique_identifier) ​​bezieht sich normalerweise auf einen Typ von UUID, der häufig in der Microsoft-Welt verwendet wird. Eine GUID ist sicherlich * nicht * ein MD5-Hash einer UUID. Dieser Variablenname scheint mir eine rote Flagge zu sein, die der Autor dieses Codes nicht vollständig verstanden hat. –

+0

@BasilBourque Ich stimme dir zu :) –

Antwort

4

Fangen wir mit dieser beginnen:

Nach UUID Spezifikation, UUID selbst ist sehr gut in die Einzigartigkeit des erzeugten UUID und Chancen der Kollision sind sehr sehr sehr klein.

Eigentlich heißt es das nicht. Das kann man nicht sagen, weil das keinen Sinn ergibt.

In der Tat, wenn die UUID-Spezifikation etwas über die Einzigartigkeit von Typ 4 UUIDs sagt, würde sie sagen, dass sie nur so gut sind wie die Quelle von Zufallszahlen. Und das hängt von der Plattform und der Qualität der RNG & UUID-Implementierungen ab. Wenn wir eine perfekte Quelle von Zufallszahlen annehmen können, dann ist die Wahrscheinlichkeit, dass zwei (getrennt erzeugte) UUIDs gleich sind, in 2 ; d. h. sehr, sehr klein. Auf der anderen Seite, wenn Sie eine schlechte Quelle von Zufallszahlen haben, erhöht sich die Wahrscheinlichkeit der paarweisen Kollision.

Also ist dieses obige Stück Code tatsächlich nicht die Qualität der Einzigartigkeit durch Hashing mit MD5, die eine veraltete Hash-Mechanismus jetzt und anfällig für Kollisionen und Angriffe ist.

Ja. Aber MD5 ist nicht das eigentliche Problem.

Wie @Doug Stevenson sagt, reduziert das Hashing einer UUID die Wahrscheinlichkeit einer Kollision nicht. Nicht einmal für einen Hash-Algorithmus, der keine bekannte Schwäche hat. Was auch immer der Algorithmus ist, es besteht die Möglichkeit, dass Hash-UUIDs die Wahrscheinlichkeit von Kollisionen erhöhen .

Im Grunde hat es keinen Sinn, eine einzelne UUID zu hashen.

Wenn Sie jedoch ein Token mit einer kleineren Kollisionswahrscheinlichkeit als eine UUID vom Typ 4 benötigen, können Sie N UUIDs vom Typ 4 in ein Array mit einem Byte verketten und anschließend einen Hash für das Array erstellen. Wenn Sie einen (starken) M-Bit-Hashalgorithmus und eine perfekte Quelle für Zufallszahlen für Ihren UUID-Generator haben, sollte die Wahrscheinlichkeit einer Kollision etwa 1: 2 min (M, 122 * N) sein.


1 - Das heißt, eine Quelle von Zufallsbits, wo es für jemanden (Angreifer) unmöglich ist, das nächste Bit in der Folge mit etwas anderem als 50% Wahrscheinlichkeit, korrekt vorherzusagen.

2 - Dies ist der Fall, wenn zwei unterschiedliche UUIDs vorhanden sind, die denselben Hashwert haben. Das ist sogar für einen starken Hash-Algorithmus möglich ... es sei denn, Sie haben dies als Kriterium definiert, mit dem Sie die Stärke messen.

3

Sie können einen wahrscheinlich einzigartigen Wert nur durch eine Hash-Funktion verschlechtern. Es kann nicht besser oder "einzigartiger" werden. Es gibt also nichts, was man durch Hashing erhalten könnte, außer es in ein einheitliches Format zu bringen, das dort verwendet werden kann, wo eine md5-Hash-Zeichenfolge benötigt wird.

+0

Einverstanden. Angenommen, die 'UUID.randomUUID()' Implementierung in Android ist als [kryptographisch-stark] (https://en.wikipedia.org/wiki/Strong_cryptography) in Bezug auf die Generierung von Zufallszahlen wie die Oracle & OpenJDK-Implementierungen, dann schon erhalten einen sehr zufälligen 128-Bit-Wert ([tatsächlich sind 122 der Bits zufällig]) (https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_.28random.29)). Der MD5-Hash gibt Ihnen einen weiteren 128-Bit-Wert, der nicht zufälliger sein wird, insbesondere angesichts der bekannten [Probleme mit MD5] (https://en.wikipedia.org/wiki/MD5#Security). –

Verwandte Themen