Ist die Verwendung von Hashes für Primärschlüssel eine gute Idee?

8

Der österreichische elektronische Personalausweis stützt sich auf die sogenannten Branchenkennungen. Zum Beispiel kann ein Krankenhaus eine Person identifizieren, indem es eine Sektor-ID für diese Person erhält, die ungefähr wie folgt berechnet wird:

sha1(personalId + "+" + prefix + sectorId); // prefix is constant and irrelevant

Ist das eine gute Idee? Ich denke, die Möglichkeit einer noch so kleinen Kollision birgt ein Risiko.

In Hashtabellen haben Sie bei einer Kollision andere Möglichkeiten, die Gleichheit herzustellen, aber mit Primärschlüsseln können Sie möglicherweise nicht zwei identische Schlüssel haben. Dies kann durch einen zusammengesetzten Schlüssel umgangen werden, aber dann geht der Punkt einer eindeutigen Sektor-ID verloren.

Ist es in Ordnung, das zu tun, und gibt es eine gute Möglichkeit, es so zu haben, ohne dass es irgendwann kaputt geht?

Bozho
quelle
Selbst wenn dieser Algorithmus ein Duplikat erstellt, gibt es in einem System keine anderen Überprüfungen, die Indizes enthalten, die keine Duplikate zulassen? Wenn ich ohne meinen Personalausweis in ein anderes Krankenhaus gehe, gibt es dann neben dieser Nummer keine andere Möglichkeit, eine Person aufzusuchen?
JeffO
8
Was bringt es überhaupt, einen Hash-Algorithmus zu verwenden? personalId+ sectorIDwird bereits als eindeutige Kennung dienen, und da sich dort nichts wie ein Passwort befindet, das versteckt werden muss, scheint Hashing keinen wirklichen Nutzen zu haben. Was vermisse ich? Oder ist die "personID" etwas Geheimnisvolles?
Doc Brown
Warum sollten Sie einer UUID vertrauen, die normalerweise (V4) aus 122 zufälligen Bits über 160 Bit besteht? Unbeabsichtigte Kollisionen sind bei letzteren offensichtlich seltener.
CodesInChaos
@ DocBrown Ich war selbst neugierig darauf. Also habe ich es oben gefunden und verlinkt. Nach ungefähr 10 Sekunden habe ich das Interesse verloren, daher bin ich mir immer noch nicht ganz sicher, ob ich den Punkt verstehe ... aber es hat etwas mit Privatsphäre zu tun ... denke ich.
Svidgen
Wenn Sie einen besseren Hash auswählen, weiß kein Mensch auf dem Planeten, wie man auch nur eine einzige Kollision erzeugt. Viele haben es versucht.
usr

Antworten:

8

In diesem früheren SO-Artikel erfahren Sie, wie Sie die Kollisionswahrscheinlichkeit berechnen. Für SHA-1 beträgt b 160. Die Zahl der in Österreich lebenden Menschen liegt unter 10 Millionen. Selbst wenn jede lebende Person in Österreich in einem Krankenhaus mit einer eindeutigen Personen- / Sektor-ID registriert ist, ergibt sich eine Kollisionswahrscheinlichkeit von weniger als 3.5 x 10^-35. Ich denke, das sollte für die meisten praktischen Zwecke klein genug sein.

Doc Brown
quelle
1
Sind Sie sicher, dass dieses Argument bei der Jury viel Gewicht haben wird, wenn es um Leben und Tod geht?
Deduplikator
1
@Deduplicator: Ich denke, die Wahrscheinlichkeit einer Kollision aufgrund eines Hardwarefehlers (einige Bits im RAM oder im Magnetspeicher) oder eines menschlichen Fehlers (z. B. eines Tippfehlers) ist viel höher, unabhängig davon, welche Art von IDs oder Hashing vorliegt wird genutzt. Aber natürlich könnte ein Pettifogger dies anders sehen.
Doc Brown
Mein Punkt ist, dass jeder Anwalt höchstwahrscheinlich einer ist ... ;-)
Deduplicator
3

Hashes kollidieren unweigerlich, wenn sie kleiner als alle möglichen Datenkombinationen sind.

Siehe diese hervorragende Antwort: https://softwareengineering.stackexchange.com/a/145633

Wenn Primärschlüssel nicht aussagekräftig sein sollen (lesbar für Menschen; mit abrufbaren Datenmerkmalen), würde ich einfach GUIDs verwenden.

Ja, theoretisch können sie auch kollidieren, aber der Hitzetod des Universums wird wahrscheinlich zuerst eintreten. Siehe https://stackoverflow.com/a/184897


BEARBEITEN: Adressierung der Kontrapunkte von @ DocBrown, um die Dinge zu klären (und um lange Diskussionen in Kommentaren zu vermeiden)

Das Generieren der Kennung aus der Personen- oder Sektor-ID war nicht die Anforderung von OP (tatsächlich gab er zu, dass er selbst auf GUIDs zurückgegriffen hatte).

Ich habe nie behauptet, dass GUIDs als Gesamtersatz für SHA-1 oder als Hashing im Allgemeinen geeignet sind (natürlich nicht). Ich sage nur, dass sie in diesem speziellen Fall verwendet werden könnten - zur eindeutigen Identifizierung einiger Entitäten. Dafür sind sie per Definition da.

Es war nie erforderlich, dass diese Kennungen aus den Daten rekonstruierbar sein müssen (was ein Vorteil von Hash-Funktionen ist). Bitte bewerten Sie meine Antwort im Kontext der eigentlichen Frage.

Konrad Morawski
quelle
@Bozho Ich denke, dein Vorschlag ist so gut wie es nur geht. Die Verwendung von zufälligen 128-Bit-Bezeichnern hält die Dinge einfach (großes Plus bereits), und Sie können diesen Werten jederzeit etwas Sinnvolles voranstellen, wenn Sie möchten. Der einzige Nachteil ist, dass die resultierenden Werte lang wären, aber Sie können nicht alles haben. Ich nehme an, dass sie normalerweise für niemanden sichtbar sind - nicht verwendet werden, da von einigen PINs erwartet wird, dass sie telefonisch zitieren.
Konrad Morawski
2
GUIDs haben 128 Bit, SHA1 erzeugt 160 Bit Ausgabe. Was lässt Sie glauben, dass GUIDs eine bessere Wahl sind als die SHA1-Hashes, die das OP in seiner Frage erwähnt hat?
Doc Brown
1
@DocBrown Ich bin zwar kein Experte auf diesem Gebiet, aber die Länge der Ausgabe an sich ist kein Problem. Jede Hash-Funktion gibt immer noch dieselbe Ausgabe für dieselbe Eingabe zurück (das ist eine Art Punkt). Wenn personalId + "+" + prefix + sectorIdes garantiert einzigartig ist, könnte es vielleicht sogar roh verwendet werden. Warum nicht? SHA1 fügt keine zusätzliche Einzigartigkeit hinzu. Das Problem ist - so wie ich es verstehe -, dass diese Formel möglicherweise keine eindeutigen Ausgaben liefert, insbesondere wenn erwartet wird, dass das System über einen längeren Zeitraum funktioniert (Gründe für die Wartbarkeit erfordern möglicherweise das Hinzufügen weiterer Sektor-IDs - Vorsicht geboten)
Konrad Morawski,
5
Ich verstehe immer noch nicht, wie eine GUID hier von Nutzen ist. Die Verwendung von GUIDs ist kein Hashing-Algorithmus. Eine GUID kann nicht aus einer personID / Sektor-ID generiert werden. Es könnte als Alternative für Letzteres verwendet werden, wenn die Generierung eindeutiger personIDs ansonsten ein Problem darstellen würde (was ich nicht denke), aber es ist kein Ersatz für so etwas wie SHA-1.
Doc Brown
1
IMHO GUIDs lösen das Problem des OP nicht. GUIDs sind hilfreich, um eindeutige Kennungen dezentral zu generieren - das "österreichische Basisregister" ist eine ziemlich zentralisierte Einrichtung, sie haben dieses Problem nicht - personalId + Sektorcode ist bereits eine eindeutige ID. Warum sollte es komplizierter werden? Die interessante Frage ist: Warum wenden sie ein Hashing an? Aber ich erwarte, dass das OP uns dies mitteilt.
Doc Brown
0

Die Verwendung eines Hash oder einer GUID als Primärschlüssel ist ebenfalls eine schlechte Idee, da dies zu Indexfragmentierung und häufigen Seitensplits führt.

Gordon Bell
quelle