Wie sollte man bei Hash-Funktionen (Hash-Algorithmen) mit Hash-Kollisionen (# collision) umgehen, wie handhabbar/ lösbar?

4 Antworten

Ohne genauere Informationen kann ich nur i meine "Glaskugel schauen und orakeln.

Was möchtest Du hashen?

Wenn es zu Hashkollisionen kommt hast du einfach einen "schmalen" Agorithmus gewählt

Powershell:

$hasher = [System.Security.Cryptography.HashAlgorithm]::Create('MD5')
$hash = $hasher.ComputeHash([System.Text.Encoding]::UTF8.GetBytes('Text to Hash'))
[System.BitConverter]::ToString($hash) -replace '-', ''

#DA330E87EDAAFAD50738838B833E4A5C

MD5 liefert einen 128 Bit "breiten" Hashwert damit können 340282366920938463463374607431768211456 Möglichkeiten unterschieden werden. Diese Zahl ist schon für sich enorm. Ungeachtet der recht großen Zahl ist unter gewissen Bedingungen eine Kollision möglich

Bei SHA512 wäre einen Kollision unwahrscheinlicher als ein schwarzes Loch unter deinen Computerstuhl

Die reale Wahrscheinlichkeit für eine Kollision beträgt 1 zu 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096

Für SHA256 .. 512 sind auch extrem kurze Strings kein Problem https://stackoverflow.com/a/7624669 . Kollisionen sind nicht bekannt.

$hasher = [System.Security.Cryptography.HashAlgorithm]::Create('SHA512')
$hash = $hasher.ComputeHash([System.Text.Encoding]::UTF8.GetBytes('Text to Hash'))
[System.BitConverter]::ToString($hash) -replace '-', ''

#EB0AAC272BAB7C82CBC46A55AE22E08F500AE524F0BBCE48DB9944C0FB9577D0595EF96648F485ACF8A3EE56781FE7CDC9652FAAE3D8B37062DCF995A94BFBF2

..in Anbetracht dessen benötigst Du keine Bastelei, sondern einfach einen Ausreichend breiten Hash.

Gaz nebenbei ist Gleichzeitigkeit eine Illusion.

Wenn Du einen Login bauen möchtest, obliegt es Dir genügend unterscheidbare Daten für die Erstellung eines Hash zu erfassen.

Gegebenenfalls musst Du schon bei der Registrierung prüfen ob es einen Gleichnamigen Nutzer gibt und dessen Loginnamen ablehnen. Das ist der Grund weshalb in der Regel eine Emailadresse genutzt wird. Da hat der Mailhoster diese Arbeit bereits erledigt. es gibt jede EMaildresse exakt nur einmal. Kombiniert mit dem "guten" Passwortstring und einem sicheren Hash SHA256 ... SHA512 kann es nur eine eindeutige Zuordnung geben!

PS: wenn Du Lange Strings Teils und die Teile einzeln hashst kannst Du jeglicher Paranoia den mittelfinge zeigen schon bei zwei 512ern werden die Whrscheinlichkeiten sureal: 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216 😮😱😵

Noch nie was von Exception-Handling gehört?
Zudem sind Kollisionen bei modernen Algorithmen relativ selten.

An deiner Stelle würde ich da auch vorgefertigte Librarys verwenden.

Woher ich das weiß:eigene Erfahrung – Zertifiziert von THM und CTF Liebhaber

Das kommt auf die Sprache an.
Du beschreibst dein Problem leider auch sehr ungenau.
Aber "Faktoren" bzw Bedingungen, die etwas "umgehen", tut man einfach mit einer "if/else if" funktion.

Die Frage ist nicht zu beantworten, da es von der Anwendung abhängt und welche Probleme eine Kollision mit sich bringt.