2017-07-05 1 views
0

Ich möchte einzigartigen Code mit sha1 mit einzigartigen Salz machen (definitiv einzigartig, weil ich ID aus der Tabelle verwenden). Ich brauche einen eindeutigen Code mit 7 Zeichen, aber ich kann keine ID aus meiner Tabelle verwenden, da sie mehr als 7 Zeichen enthält. Also denke ich, dass es besser ist, sha1 zu verwenden und die ersten 7 Zeichen von Hash-Text als meinen einzigartigen Code zu verwenden. Beeinflusst die Länge des zu haschenden Textes die Wahrscheinlichkeit einer Kollision?Beeinflusst die Länge des zu haschenden Textes die Wahrscheinlichkeit einer Kollision?

zum Beispiel:

textA = "myId:12345678" 
textB = "myId:12345678, myId2:87654321" 

Ist es besser, langen Kurztext zu verwenden (z Texta) oder Text (z textb)? Oder hat die Textlänge keine Auswirkung?

+0

Siehe auch Kelseys Arbeit zu [Truncated Hashes] (https://www.google.com/search?q=kelsey+truncated+hash). Es gibt keinen Beweis dafür, dass ein abgeschnittener Hash die gleichen Eigenschaften eines vollständigen Hash besitzt. Wenn möglich, sollten Sie die Kürzung vermeiden. Vielleicht können Sie [Formatieren der Verschlüsselung] verwenden (https://www.google.com/search?q=Format+Preserving+Encryption). FPE hat begleitende Beweise. – jww

Antwort

1

Das Hashing Ihrer eindeutigen IDs ist keine gute Idee. Tu es nicht.

Wenn Ihre IDs aus 7 Hex-Ziffern bestehen, erhalten Sie damit 268 435 456 eindeutige Werte. Wenn Sie diese Werte hashen und die Ergebnisse auf 7 Hexadezimalziffern abschneiden, dann the probability of a collision rises very quickly (1% Wahrscheinlichkeit nach 2.322 Eingaben, 50% nach 19.290 Eingaben, 99% nach 35.159 Eingaben).

Wenn Sie diese ID-Werte tarnen möchten, damit ein Angreifer die tatsächlichen sequenziellen Werte nicht ermitteln kann, verwenden Sie stattdessen format-preserving encryption.

Bearbeiten: Wenn Sie etwas Sicheres benötigen, können Sie versuchen, eine Feistel network mit einer Verschlüsselungsfunktion wie AES als die runde Funktion zu implementieren. (. AES Overkill ist vielleicht, aber dies könnte in ein paar Zeilen Code in den meisten Sprachen auf der Grundlage bestehender Primitive implementiert werden) Wenn Sie nur die IDs verschleiern wollen, könnten Sie etwas einfacher wie folgt verwenden:

def obfuscate_id(id, key): 
    # Transforms id using a 28-bit key 
    a = 81883721 # (random prime congruent to 1 mod 4) 
    c = 2791751 # (any odd number will do) 
    m = 2**28  # (modulus for 7-digit hex values) 
    return ((id^key) * a + c) % m 
+0

und jww danke für Ihren Vorschlag. Ich habe über Format-Erhaltung-Verschlüsselung gelesen. Eigentlich möchte ich diese ID-Werte nicht verschleiern, aber ich möchte zufälligen und eindeutigen Code (nur 7 oder 8 Zeichen) machen. Ich denke, dass ich diese ID für eindeutigen Code verwenden kann, aber meine ID hat zu viel Charakter. Also muss ich es zu 7 oder 8 Ziffern machen. Wenn möglich, lass mich wissen, wie ich das machen kann. Danke –

+0

@FerryGideon Sorry wegen der Verzögerung; Ich habe die Antwort etwas aktualisiert. –

Verwandte Themen