2008-10-07 7 views
5

Gibt es eine Möglichkeit, einen Hash einer Zeichenfolge zu generieren, so dass der Hash selbst eine bestimmte Länge hätte? Ich habe eine Funktion, die 41-Byte-Hashes (SHA-1) generiert, aber ich brauche es maximal 33 Bytes (wegen bestimmter Hardware-Einschränkungen). Wenn ich den 41-Byte-Hash auf 33 trenne, würde ich (sicherlich!) Die Eindeutigkeit verlieren.Hash einer Zeichenfolge mit bestimmter Länge

Oder eigentlich nehme ich an, dass ein MD5-Algorithmus gut passen würde, wenn ich mit Ihrer Hilfe einen C-Code für einen finden könnte.

EDIT: Danke Ihnen allen für die schnelle und sachkundige Antworten. Ich habe mich für einen MD5-Hash entschieden und es passt für meinen Zweck. Die Eindeutigkeit ist ein wichtiges Problem, aber ich erwarte nicht, dass die Anzahl dieser Hashes zu jedem Zeitpunkt sehr groß ist - diese Hashes repräsentieren Software-Server in einem Heim-LAN, so dass maximal 5, vielleicht 10, laufen würden.

Antwort

5

Die Weg-Hashes sind berechnet, das ist leider nicht möglich. Um die Hash-Länge auf 33 Bytes zu begrenzen, müssen Sie sie ausschneiden. Sie könnten die ersten und letzten 33 Byte xorieren, da dies möglicherweise mehr Informationen enthält. Aber selbst mit 33 Bytes haben Sie keine große Chance auf eine Kollision.

md5: http://www.md5hashing.com/c++/

btw. md5 ist 16 Bytes, sha1 20 Bytes und sha256 ist 32 Bytes, aber als Hexstrings sind alle doppelt so groß. Wenn Sie Bytes speichern können, können Sie sogar sha256 verwenden.

+0

Vielen Dank - ich gebe es zu versuchen ... – dennisV

+1

Ihr BTW ist die echte Antwort. Wenn Sie wenig Speicher haben, speichern Sie Ihre Hashes nicht als Hex-Strings! –

+0

MD5 ist 'mehr gebrochen-er' als SHA1 und sha256. Sie sollten besser abgeschnitten und die zusätzlichen 12 Bytes der Entropie verwenden. – Aaron

1

Ich glaube, dass der MD5-Hashing-Algorithmus eine 32-stellige Zahl ergibt, vielleicht wird diese also besser geeignet sein.

Edit: Um auf die MD5-Funktionalität zugreifen zu können, sollte es möglich sein, sich in die openssl-Bibliotheken einzuklinken. Sie haben jedoch Hardwarebeschränkungen erwähnt, so dass dies in Ihrem Fall nicht möglich ist.

+0

Ihre Bearbeitung Beat meine Antwort :) –

+0

Ja :) Würdest du zufällig wissen, wo ich einen Code dafür finden könnte? Vielen Dank! – dennisV

+0

sieht aus wie Staale schlug mich zu diesem –

3

Sie könnten einen Elf hash (< - C-Code enthalten) oder eine andere einfache Hash-Funktion wie diese anstelle von MD5 oder SHA-X verwenden. Sie sind nicht sicher, aber sie können auf jede beliebige Länge Sie benötigen

1

Die Chance einer Kollision 33-Byte eingestellt werden 1/2^132 (durch das Geburtstagsparadoxon)

Also keine Sorge über die Einzigartigkeit verlieren.

Update: Ich habe die tatsächliche Byte-Länge von SHA1 nicht überprüft. Hier ist die relevante Berechnung: eine 32-Nibble-Kollision (33 Byte Hexadezimal - 1 Abschlusszeichen), tritt nur auf, wenn die Anzahl der gehackten Strings um sqrt (2^(32 * 4)) = 2^64 wird.

1

Here ist eine MD5-Implementierung in C

2

Hashes sind per Definition nur einzigartig für kleine Datenmenge (und selbst dann ist es noch nicht garantiert). Es ist unmöglich, eine große Menge an Informationen eindeutig einer kleinen Menge von Informationen zuzuordnen, und zwar aufgrund der Tatsache, dass Sie nicht in der Lage sind, Informationen mikramental loszuwerden und sie später wieder zu bekommen. Beachten Sie, dass dies keine Kompression ist.

Persönlich würde ich MD5 (wenn Sie in Text speichern müssen), oder ein 256b (32B) Hash wie SHA256 (wenn Sie in binär speichern können) in dieser Situation verwenden. Das Abschneiden eines anderen Hash-Algorithmus auf 33B funktioniert ebenfalls und kann die Möglichkeit erhöhen, Hash-Kollisionen zu erzeugen. Es hängt viel vom Algorithmus ab.

Also, yet another C implementation of MD5, by the people who designed it.

4

Es besteht keine Chance einer Kollision mit Teilkette (sha_hash, 0, 33) als mit irgendeiner anderen Hash, der 33 Bytes lang ist, aufgrund der Art und Weise Hash-Algorithmen entwickelt werden (Entropie gleichmäßig verteilt wird, in der resultierenden Zeichenfolge).

+2

Dies ist aufgrund der Berechnung der Hashwerte nicht völlig richtig. Die Mathematik ist kompliziert, aber Teilkollisionen sind viel einfacher zu erzeugen als Vollkollisionen. –

+0

Monoxid: Ja, sie sind im Verhältnis zur Anzahl der Bits einfacher. 16 Byte SHA1 sind mindestens so sicher wie ein MD5. Wenn es anders wäre, wären die Hashes nicht sicher. –

+0

1/2 SHA1 würde jetzt tatsächlich als sicherer angesehen werden. MD5 ist "gebrochener" als SHA1 – Aaron

6

Wenn ich den 41-Byte-Hash auf 33 kürzen würde, würde ich (sicherlich!) Die Eindeutigkeit verlieren.

Was lässt Sie denken, dass Sie jetzt Einzigartigkeit haben? Ja, es gibt eindeutig eine höhere Wahrscheinlichkeit einer Kollision, wenn Sie nur mit 33 statt 41 Bytes spielen, aber Sie müssen sich bewusst sein, dass Kollisionen nur unwahrscheinlich, nicht unmöglich sind, für jede Situation, in der es sinnvoll ist, einen Hash zu verwenden an erster Stelle. Wenn Sie mehr als 41 Datenbytes hashen, gibt es deutlich mehr Kombinationsmöglichkeiten als verfügbare Hashes.

Nun, ob es besser wäre, den SHA-1-Hash zu kürzen oder einen kürzeren Hash wie MD5 zu verwenden, weiß ich nicht. Ich denke, ich wäre insgesamt sicherer, wenn ich den ganzen Hashwert halte, aber MD5 hat known vulnerabilities, was für Ihre spezielle Anwendung ein Problem sein kann oder auch nicht.

+0

Es ist nicht so sehr, dass es Schwachstellen hat, sondern dass die Datenverarbeitung bis zu dem Punkt fortgeschritten ist, an dem es mit den richtigen Tools nun routinemäßig forciert werden kann. Mit den richtigen Vorsichtsmaßnahmen ist MD5 mehr oder weniger sicher. (liest: ein Salz vorangestellt) –

+0

Das Abschneiden eines Hashes gibt keine Garantie für seine Eindeutigkeit und sollte daher vermieden werden. –

+0

Andreas: Sie haben bereits keine Garantie für die Einzigartigkeit. Es ist ein Hash - es macht etwas "besten Aufwand", um Einzigartigkeit zu erreichen, aber grundsätzlich sollten Sie Hashes immer als nicht-einzigartig betrachten. –