Hash Code und Prüfsumme - was ist der Unterschied?

115

Mein Verständnis ist, dass ein Hash-Code und eine Prüfsumme ähnliche Dinge sind - ein numerischer Wert, der für einen Datenblock berechnet wird, der relativ ist eindeutig ist.

dh Die Wahrscheinlichkeit, dass zwei Datenblöcke denselben numerischen Hash- / Prüfsummenwert ergeben, ist niedrig genug, dass sie für die Zwecke der Anwendung ignoriert werden können.

Haben wir also zwei Wörter für dasselbe oder gibt es wichtige Unterschiede zwischen Hash-Codes und Prüfsummen?

Richard Ev
quelle
3
Um die Antworten unten zusammenzufassen: Ein Hash-Code reduziert die Eingabe auf eine kleine Zahl, so dass das Risiko von Kollisionen minimiert wird. Eine Prüfsumme hingegen reduziert die Eingabe auf eine kleine Zahl, wodurch die Wahrscheinlichkeit von Kollisionen minimiert wird. Sie können einen Klang vom anderen unterscheiden, indem Sie diese Beschreibung willkürlich umformulieren.
Dan Stahlke
3
@DanStahlke - No, that isn't what the answers below say. Yes, they both reduce input to a smaller number. But there are many, many ways to do so, how to choose what algorithm to use? That depends on your goal. To summarize the top two answers: the goal of a checksum is "to detect the most common errors". Choose an algorithm that yields a different checksum, for whatever errors are "most common" in your scenario. If you are worried about one or two bits being toggled, you can pick an algorithm that guarantees detection of that specific error! This is a very specific trade-off.
ToolmakerSteve
1
@DanStahlke - on the other hand, hash code covers a broad range of possible trade-offs. If we mean a value used in making a hash table, we know that there will be collisions, lots of them. This is a very different trade-off (than a checksum). We are trying to reduce collisions on average. We don't guarantee anything. There may be some inputs that differ by only one bit, yet yield the same hash. This is perfectly fine, if on average we get a good spread of hash values. Yet would be unacceptable for a checksum.
ToolmakerSteve

Antworten:

72

Ich würde sagen, dass eine Prüfsumme notwendigerweise ein Hashcode ist . Allerdings sind nicht alle Hashcodes gute Prüfsummen.

Eine Prüfsumme hat einen besonderen Zweck - sie überprüft oder überprüft die Integrität von Daten (einige können darüber hinausgehen, indem sie eine Fehlerkorrektur zulassen ). "Gute" Prüfsummen sind einfach zu berechnen und können viele Arten von Datenverfälschungen erkennen (z. B. ein, zwei, drei fehlerhafte Bits).

Ein Hashcode beschreibt einfach eine mathematische Funktion , die Daten einem bestimmten Wert zuordnet . Bei Verwendung als Indizierungsmittel in Datenstrukturen (z. B. einer Hash-Tabelle) ist eine geringe Kollisionswahrscheinlichkeit wünschenswert.

Zach Scrivena
quelle
6
Vielleicht könnte eines als das andere verwendet werden, aber wenn man bedenkt, dass sie unterschiedliche Designziele haben, verwirrt dies das Problem nur.
Wim Coenen
8
@gumbo: nein, nicht jeder Hashcode ist eine Prüfsumme. Siehe Zeichenfolgenbeispiel von MSalters unten.
MarcH
41

Hinter jedem von ihnen steckt ein anderer Zweck:

  • Hash-Code - so konzipiert, dass er in seiner gesamten Domäne zufällig ist (um Kollisionen in Hash-Tabellen und dergleichen zu minimieren). Kryptografische Hash-Codes sind auch so konzipiert, dass sie rechnerisch nicht rückgängig gemacht werden können.
  • Prüfsumme - Entwickelt, um die häufigsten Fehler in den Daten zu erkennen und häufig schnell zu berechnen (für eine effektive Prüfsumme schneller Datenströme).

In der Praxis sind häufig dieselben Funktionen für beide Zwecke gut. Insbesondere ein kryptografisch starker Hash-Code ist eine gute Prüfsumme (es ist fast unmöglich, dass ein zufälliger Fehler eine starke Hash-Funktion zerstört), wenn Sie sich die Rechenkosten leisten können.

Rafał Dowgird
quelle
1
Es ist auch gut zu erwähnen, dass eine nicht kryptografische Version von Hash-Codes einen guten Kompromiss zwischen Rechenzeit (in der Nähe von CRC) und Fehlererkennung bieten kann, unabhängig davon, ob es sich um einen beabsichtigten oder nur um einen Kommunikationsfehler / Bitfäule handelt (von CRC kann nicht erwartet werden, dass er absichtliche Manipulationen erkennt, weil Es ist relativ einfach, absichtlich eine Kollision zu entwerfen.
gaborous
1
Für mich lautet der Schlüsselbegriff in Ihrer Antwort, dass die Prüfsumme die häufigsten Fehler erkennen soll . Ja das ist es. Es handelt sich um einen Hash-Algorithmus, der ausgewählt wurde, um unterschiedliche Werte für wahrscheinliche Verfälschungen der Daten zu erhalten. Das ist ein spezifischer Zweck und führt zu spezifischen Algorithmen, die sich dafür optimieren - abhängig von der Art der Störungen, um die es geht.
ToolmakerSteve
22

Es gibt tatsächlich einige Unterschiede:

  • Prüfsummen müssen nur unterschiedlich sein, wenn die Eingabe unterschiedlich ist (so oft wie möglich), aber es ist fast genauso wichtig, dass sie schnell berechnet werden können.
  • Hash-Codes (zur Verwendung in Hashtabellen) haben dieselben Anforderungen und sollten außerdem gleichmäßig über den Codebereich verteilt sein, insbesondere für Eingaben, die ähnlich sind.
  • Kryptografische Hashes haben die viel strengere Anforderung, dass Sie bei einem Hash keine Eingabe erstellen können, die diesen Hash erzeugt. Die Berechnungszeiten stehen an zweiter Stelle, und je nach Anwendung kann es sogar wünschenswert sein, dass der Hash sehr langsam berechnet wird (um Brute-Force-Angriffe zu bekämpfen).
Michael Borgwardt
quelle
1
Ich denke nicht, dass Prüfsummen, die für verschiedene Eingaben unterschiedlich sind, Vorteile haben. Sie dienen nur zur Überprüfung der Integrität, nicht zum Hashing.
user541686
1
@Mehrdad: Wie schlagen Sie vor, die Integrität zu überprüfen, ohne unterschiedliche Ergebnisse für unterschiedliche Eingaben zu erhalten?
Michael Borgwardt
Ähm, vielleicht habe ich falsch geschrieben, was ich gesagt habe? Ich habe mich auf den Teil bezogen, in dem Sie "so weit wie möglich" gesagt haben - ich sage nur, dass es keinen Grund gibt, unvorhersehbar oder "weit" zu sein, wie Hashes sind. Solange gibt es einige Wechsel in der Prüfsumme , wenn die Eingabe eine typische Veränderung erfährt, ist es eine feine Prüfsumme. Vergleichen Sie dies mit Hashes, die auch das Ziel haben, die Dinge so gleichmäßig / zufällig / unvorhersehbar / "weit" wie möglich auf ihre Codomäne zu verteilen.
user541686
Ich denke, Sie haben nur falsch interpretiert, was ich mit "so weit wie möglich" meinte - ich meinte nur, dass Kollisionen so selten wie möglich sein sollten, obwohl sie natürlich unvermeidbar sind. Ich werde den Wortlaut ändern.
Michael Borgwardt
@Mehrdad - das ergab für mich zunächst keinen Sinn. Wenn eine Prüfsumme nicht nicht eine gute Verteilung über mögliche Prüfsummenwerten haben, das heißt , es gibt einige Prüfsumme Werte , die für viele weitere Eingabewerte zurückgegeben werden (als für andere Prüfsummen). Aber das verringert die Nützlichkeit der Prüfsumme? [Es erhöht die Wahrscheinlichkeit, dass gestörte Daten das gleiche Ergebnis liefern, oder?] Hmm, ich irre mich, Sie haben Recht: Die Prüfsumme muss nur gut darin sein, wahrscheinliche Störungen zu erkennen. Dies erfordert möglicherweise keine gleichmäßige Verteilung über alle Werte.
ToolmakerSteve
10

Hashcodes und Prüfsummen werden beide verwendet, um aus einem Datenelement einen kurzen numerischen Wert zu erstellen. Der Unterschied besteht darin, dass sich ein Prüfsummenwert ändern sollte, selbst wenn eine kleine Änderung am Datenelement vorgenommen wird. Für einen Hash-Wert besteht die Anforderung lediglich darin, dass reale Datenelemente unterschiedliche Hash-Werte haben müssen.

Ein klares Beispiel sind Zeichenfolgen. Eine Prüfsumme für eine Zeichenfolge sollte jedes einzelne Bit enthalten, und die Reihenfolge ist wichtig. Ein Hashcode hingegen kann häufig als Prüfsumme eines Präfixes mit begrenzter Länge implementiert werden. Das würde bedeuten, dass "aaaaaaaaaaba" dasselbe wie "aaaaaaaaaaab" hasht, aber Hash-Algorithmen können mit solchen Kollisionen umgehen.

MSalters
quelle
Diese Antwort klingelt für mich. Datenintegrität steht also nicht im Mittelpunkt eines Hashs.
Truthadjustr
9

Wikipedia drückt es gut aus:

Prüfsummenfunktionen beziehen sich auf Hash-Funktionen, Fingerabdrücke, Randomisierungsfunktionen und kryptografische Hash-Funktionen. Jedes dieser Konzepte hat jedoch unterschiedliche Anwendungen und daher unterschiedliche Entwurfsziele. Prüfziffern und Paritätsbits sind Sonderfälle von Prüfsummen, die für kleine Datenblöcke geeignet sind (z. B. Sozialversicherungsnummern, Bankkontonummern, Computerwörter, einzelne Bytes usw.). Einige Fehlerkorrekturcodes basieren auf speziellen Prüfsummen, die nicht nur häufige Fehler erkennen, sondern in bestimmten Fällen auch die Wiederherstellung der Originaldaten ermöglichen.

Jon Skeet
quelle
28
Nachdem ich das gelesen habe, frage ich mich immer noch, was der Unterschied ist.
Kirk.burleson
@ kirk.burleson - Ich würde sagen, dass sie das gleiche Prinzip sind , aber in der Praxis macht man immer Kompromisse . In unterschiedlichen Situationen gelten unterschiedliche Kompromisse, sodass unterschiedliche Ansätze verwendet werden. Nicht wirklich eine Rechtfertigung dafür, dass es zwei verschiedene Wörter gibt. Wenn Sie nach guten Techniken für Prüfsummen suchen, finden Sie möglicherweise einen anderen Satz von Algorithmen als bei der Suche nach Hash-Codes.
ToolmakerSteve
5

Eine Prüfsumme schützt vor versehentlichen Änderungen.

Ein kryptografischer Hash schützt vor einem sehr motivierten Angreifer.

Wenn Sie Bits auf dem Draht senden, kann es versehentlich vorkommen, dass einige Bits entweder umgedreht, gelöscht oder eingefügt werden. Damit der Empfänger solche Unfälle erkennen (oder manchmal korrigieren) kann, verwendet der Absender eine Prüfsumme.

Wenn Sie jedoch davon ausgehen, dass jemand die Nachricht auf dem Kabel aktiv und intelligent ändert und Sie sich gegen diese Art von Angreifer schützen möchten, verwenden Sie einen kryptografischen Hash (ich ignoriere das kryptografische Signieren des Hash oder die Verwendung eines sekundären Kanals oder dergleichen seitdem die Frage scheint sich dem nicht zu entziehen).

user3464863
quelle
3
"kryptografischer Hash" erhöht die Verwechslung zwischen "Hash" und "Prüfsumme". "kryptografische Prüfsumme" ist besser, weil dies nicht der Fall ist.
MarcH
5

Obwohl Hashing und Prüfsummen insofern ähnlich sind, als beide einen Wert basierend auf dem Inhalt einer Datei erstellen, ist Hashing nicht dasselbe wie das Erstellen einer Prüfsumme. Eine Prüfsumme soll die Integrität von Daten überprüfen (überprüfen) und Datenübertragungsfehler identifizieren, während ein Hash einen eindeutigen digitalen Fingerabdruck der Daten erstellen soll.

Quelle: CompTIA ® Security + Leitfaden zu Grundlagen der Netzwerksicherheit - Fünfte Ausgabe - Mark Ciampa - Seite 191

N Randhawa
quelle
4

Heutzutage sind sie austauschbar, aber in früheren Tagen war eine Prüfsumme eine sehr einfache Technik, bei der Sie alle Daten addieren (normalerweise in Bytes) und am Ende ein Byte mit diesem Wert in ... anheften, dann würden Sie es hoffentlich tun wissen, ob eine der Originaldaten beschädigt wurde. Ähnlich wie ein Prüfbit, jedoch mit Bytes.

Steven Robbins
quelle
4

Der Unterschied zwischen Hash-Code- und Prüfsummenfunktionen besteht darin, dass sie für unterschiedliche Zwecke entwickelt wurden.

  • Eine Prüfsumme wird verwendet, um herauszufinden, ob sich etwas in der Eingabe geändert hat.

  • Ein Hash-Code wird verwendet, um herauszufinden, ob sich etwas in der Eingabe geändert hat und um so viel "Abstand" wie möglich zwischen einzelnen Hash-Code-Werten zu haben.

    Im Gegensatz zu dieser Regel gibt es möglicherweise weitere Anforderungen an eine Hash-Funktion, z. B. die Fähigkeit, frühzeitig Bäume / Cluster / Buckets mit Hash-Code-Werten zu bilden.

    Und wenn Sie eine gemeinsame anfängliche Randomisierung hinzufügen, gelangen Sie zum Konzept für moderne Verschlüsselung / Schlüsselaustausch.


Über die Wahrscheinlichkeit:

Nehmen wir beispielsweise an, dass sich die Eingabedaten tatsächlich immer ändern (100% der Zeit). Nehmen wir an, Sie haben eine "perfekte" Hash- / Prüfsummenfunktion, die einen 1-Bit-Hash- / Prüfsummenwert generiert. Daher erhalten Sie in 50% der Fälle unterschiedliche Hash- / Prüfsummenwerte für zufällige Eingabedaten.

  • Wenn sich genau 1 Bit in Ihren zufälligen Eingabedaten geändert hat, können Sie dies zu 100% erkennen, unabhängig davon, wie groß die Eingabedaten sind.

  • Wenn sich 2 Bits in Ihren zufälligen Eingabedaten geändert haben, wird Ihre Wahrscheinlichkeit, "eine Änderung" zu erkennen, durch 2 geteilt, da sich beide Änderungen gegenseitig neutralisieren könnten und keine Hash- / Prüfsummenfunktion erkennen würde, dass 2 Bits in den Eingabedaten tatsächlich unterschiedlich sind .

    ...

Dies bedeutet: Wenn die Anzahl der Bits in Ihren Eingabedaten um ein Vielfaches größer ist als die Anzahl der Bits in Ihrem Hash- / Prüfsummenwert, verringert sich Ihre Wahrscheinlichkeit, tatsächlich unterschiedliche Hash- / Prüfsummenwerte für unterschiedliche Eingabewerte zu erhalten, und ist nicht a konstant .

Sascha Wedler
quelle
2

Ich neige dazu, das Wort Prüfsumme zu verwenden, wenn ich mich auf den Code (numerisch oder anderweitig) beziehe, der für eine Datei oder ein Datenelement erstellt wurde, mit dem überprüft werden kann, ob die Datei oder die Daten nicht beschädigt wurden. Die häufigste Verwendung besteht darin, zu überprüfen, ob über das Netzwerk gesendete Dateien (absichtlich oder auf andere Weise) nicht geändert wurden.

Ian1971
quelle
1
Da es nicht schwierig ist, Prüfsummen rückgängig zu machen, deutet dies darauf hin, dass sie nicht geeignet sind, um zu überprüfen, ob etwas absichtlich geändert wurde.
Benblasdell
0

Beim Redis-Cluster-Daten-Sharding wird mit a entschieden, hash slotauf welchen Knoten es sich bezieht. Nehmen Sie zum Beispiel die folgende Modulo-Operation:

123 % 9 = 6
122 % 9 = 5
141 % 9 = 6

Das 6 kommt zweimal über verschiedene Eingänge. Der Zweck des Hash besteht einfach darin, einen Eingabewert einem Ausgabewert zuzuordnen, und die Eindeutigkeit ist nicht Teil des Geschäfts. In der Welt der Hashes sind also zwei verschiedene Eingaben, die dieselbe Ausgabe erzeugen, in Ordnung.

Andererseits muss eine Prüfsumme die Ausgabe unterscheiden, selbst wenn sich ein Bit in der Eingabe ändert, da ihr Zweck nicht darin besteht, Daten zu beschädigen, sondern sie zu erkennen. Daher sind zwei verschiedene Eingaben, die dieselbe Ausgabe erzeugen, in einer Prüfsumme nicht akzeptabel.

trueadjustr
quelle
-4

Eine Prüfsumme ist einfach eine Zahl, die durch Oring aus dem Datenfeld generiert wird (durch logische Addition, also Summe). Die Prüfsumme kann eine Beschädigung eines Bits oder einer Anzahl von Bits innerhalb des Datenfelds erkennen, aus dem sie generiert wird, dh sie sucht nach Fehlern, die alles sind, und kann sie nicht korrigieren. Eine Prüfsumme ist ein Hash, da die Größe der Prüfsumme kleiner als die Originaldaten ist. Ja, Sie haben Kollisionen, da die Prüfsumme überhaupt nicht empfindlich auf die Bitposition im Datenfeld reagiert.

Eine zyklische Redundanzprüfung (CRC) ist etwas ganz anderes, komplexer und wird NICHT als Prüfsumme bezeichnet. Es ist die Anwendung einer Polynomreihe, die die Fähigkeit hat, eine beliebige Anzahl von einzelnen beschädigten Bits innerhalb des Datenfeldes zu korrigieren, aus dem sie erzeugt wurde. Die Erstellung eines CRC führt zu einer Zahl, die größer ist als das ursprüngliche Datenfeld (im Gegensatz zur Prüfsumme) - daher der Name einschließlich des Wortes "Redundanz" und der Preis, den Sie für die Fehlerkorrekturfunktion zahlen. Ein CRC ist daher KEIN Hash und darf nicht als Prüfsumme verwechselt oder benannt werden, da die Redundanz notwendigerweise die Größe der Originaldaten erhöht.

CapitainSensible
quelle