Ganzzahlige ID-Verschleierungstechniken

8

Ich suche nach einer einfachen und reversiblen Methode zur Verschleierung von ganzzahligen IDs. Idealerweise sollte die resultierende Verschleierung höchstens acht Zeichen lang und nicht sequenziell sein, was bedeutet, dass die Verschleierung von "1" nicht so aussehen sollte wie die Verschleierung für "2" und so weiter.

Dies soll nicht unbedingt sicher sein, also ist das keine große Sorge. Außerdem sind die Ganzzahlen, die ich verschleiern werde, nicht groß - zwischen einem und 10.000 -, aber ich möchte auch keine Kollisionen.

Hat jemand Ideen für etwas, das zu diesen Kriterien passt?

Danke!
Chris

    
Chris Harrington 02.04.2010, 07:12
quelle

10 Antworten

5

Ich habe eine Idee vom Pearson-Hashing abgeleitet, die auch für beliebige Eingaben funktioniert, nicht nur für 32-Bit-Ganzzahlen. Ich weiß nicht, ob das genau dasselbe ist wie Gregs Antwort, aber ich konnte nicht verstehen, was er meinte. Aber was ich weiß ist, dass die Speicheranforderungen hier konstant sind. Egal, wie groß die Eingabe ist, dies ist immer noch ein zuverlässiger Trick der Verschleierung / Verschlüsselung.

Für den Datensatz ist diese Methode nicht hashing und es hat keine Kollisionen. Es ist eine absolut vernünftige Methode, um eine Bytefolge zu verschleiern.

Was Sie dafür brauchen, ist ein geheimer Schlüssel _encryptionTable , der eine zufällige Permutation des inklusiven Bereichs 0..255 ist. Sie verwenden dies, um Bytes zu mischen. Um es wirklich schwer zu machen umzukehren, verwendet XOR, um die Byte-Zeichenfolge ein bisschen zu mischen.

%Vor%

Sie können dann den BitConverter verwenden, um zwischen Werten und Bytearrays zu wechseln, oder einige, die in die Basis 64 oder 32 konvertiert werden, um eine textuelle Darstellung zu erhalten. Base 32-Codierung kann URL-freundlich sein, wenn das wichtig ist. Entschlüsseln ist so einfach wie das Umkehren der Operation durch Berechnen der Umkehrung von _encryptionTable .

%Vor%

Sie können auch andere lustige Dinge tun, wenn Sie an einer 32-Bit-Ganzzahl arbeiten und nur auf die Zahlen achten, die größer oder gleich 0 sind, was es schwieriger macht, eine verschleierte Zahl zu erraten.

Ich benutze auch ein geheimes Wort, um einen Pseudo-Zahlengenerator zu erzeugen und benutze das, um die anfängliche Permutation einzurichten. Deshalb kann ich einfach den Wert bekommen, indem ich weiß, welches geheime Wort ich für alles verwendet habe.

%Vor%

Das ist etwas sicher, der größte Fehler hier ist, dass die Verschlüsselung, XOR mit 0, zufällig die Identität von XOR ist und den Wert nicht ändert ( a ^ 0 == a ). Somit repräsentiert das erste verschlüsselte Byte die zufällige Position dieses Bytes. Um dies zu umgehen, können Sie einen Initialwert für c auswählen, der nicht konstant ist, basierend auf dem geheimen Schlüssel, indem Sie den PRNG (nach init mit Seed) nach einem zufälligen Byte fragen. Auf diese Weise ist es selbst mit einer großen Stichprobe sehr schwierig, die Verschlüsselung zu knacken, solange Sie die Eingabe und Ausgabe nicht beobachten können.

    
John Leidegren 02.04.2010, 09:08
quelle
11

Wenn Sie nur etwa 10.000 Ganzzahlen haben, dann wäre der einfachste und zuverlässigste Weg wahrscheinlich eine Zuordnungstabelle zwischen der Ganzzahl und einer zufällig erzeugten Zeichenkette. Entweder generieren Sie eine Reihe von zufälligen Bezeichnern im Voraus, die jeder Ganzzahl entsprechen, oder füllen Sie sie bei Bedarf einfach aus.

Auf diese Weise können Sie keine Kollisionen garantieren und müssen sich keine Gedanken über die Verschlüsselung machen, da es nichts zu entschlüsseln gibt, da die Zeichenfolgen nicht von den Ganzzahlen selbst abgeleitet werden.

Sie können es abhängig von Ihren Anforderungen in einer Datenbanktabelle oder im Speicher (z. B. einem Zweiwege-Wörterbuch) implementieren.

    
Greg Beech 02.04.2010 07:17
quelle
6

Ich weiß, das wurde vor sieben Monaten gefragt, also werdet ihr jetzt eine Lösung gefunden haben, aber die Lösung, auf die ich gestoßen bin, ist eine Kombination aus Skip32 / Skipjack-Chiffre + einer Base32-Kodierung. Das Perl-Beispiel (da ich von einem weiß) zeigt:

%Vor%

Ich weiß nicht, ac # Implementierung, aber ein Perl ist Ссылка und Die zwei Bestandteile für einen Rubin sind Ссылка und Ссылка . Zwischen den beiden sollte es möglich sein, sie in jede gewünschte Sprache zu portieren.

    
Ash Berlin-Taylor 16.11.2010 23:46
quelle
4

XOR ist eine schöne und schnelle Art, ganze Zahlen zu verschleiern:

%Vor%

Es ist schnell, und mit der gleichen Nummer gibt es wieder das Original! Das einzige Problem ist, wenn ein "Angreifer" irgendeine der Zahlen kennt, können sie die Xor-Maske ... zufällig herausfinden, indem sie das Ergebnis mit dem bekannten Original kopieren!

Zum Beispiel ich (der "Angreifer") jetzt, dass die 4. Nummer in dieser Liste eine verschleierte "100" ist. Also werde ich tun:

%Vor%

... und jetzt habe ich die XOR-Maske und ich kann jede der Zahlen entschleiern. Glücklicherweise gibt es eine triviale Lösung für dieses Problem. Ändern Sie die XOR-Maske algorithmisch. Wenn Sie zum Beispiel 1000 ganze Zahlen in einem Array verschleiern müssen, beginnen Sie mit einer XOR-Maske von "1234" und erhöhen Sie die MASK mit 4 für jede Zahl im Array.

    
Cosmin Prund 02.04.2010 09:18
quelle
2

Falls andere Leute interessiert sind, hat jemand vor einigen Jahren eine 32-Bit Blockchiffre angepasst, was besonders nützlich für diese Aufgabe ist.

Es gibt auch einen Perl- und Ruby-Port des obigen:

Wenn Sie das Ergebnis in 8 Zeichen oder weniger benötigen, können Sie eine Hex- oder Base64-Darstellung verwenden.

    
jingoro 13.06.2010 06:07
quelle
1

Nettes Projekt, um das mit Bibliotheken in den meisten Sprachen zu handhaben: Ссылка

    
emertechie 29.06.2016 14:16
quelle
1

Aktualisierung Mai 2017

Fühlen Sie sich frei, die Bibliothek zu verwenden (oder zu modifizieren), die ich über Nuget mit:

installiert habe
  

Install-Paket Kent.Cryptography.Obfuscation

Dies konvertiert eine nicht-negative ID wie 127 in 8-stellige Zeichenfolge , z. xVrAndNb und zurück (mit einigen verfügbaren Optionen, um die Sequenz bei jeder Generierung zufällig zu gestalten).

Beispiel Verwendung

%Vor%

Vollständige Dokumentation unter: Github .

Alte Antwort

Einfach nur Abwechslung zu einer alten Antwort hinzufügen. Vielleicht wird es jemand brauchen. Dies ist eine Verschleierung, die ich irgendwann gemacht habe.

Obfuscation.cs - Github

Sie können es verwenden:

%Vor%

Prost, hoffentlich kann es nützlich sein.

    
Ken Timothy 05.04.2015 17:19
quelle
0

Sie könnten mit den Bitpattern der Zahl spielen - zB dreht und tauscht die Bits. Das wird Ihnen eine Möglichkeit geben, sich zwischen einer Anzahl von 26 Bit und einer anderen Anzahl von 26 Bit zu bewegen, die einem menschlichen Beobachter nicht sofort klar sind. Obwohl es keineswegs "sicher" ist.

    
Ben Clifford 02.04.2010 09:14
quelle
-1

Ich weiß, dass dies ein alter Post ist, aber ich dachte, dass es hilfreich sein könnte, meine Technik zum Verschleiern von Ganzzahl-IDs

zu posten

Nachteile: verwendet mehr als 8 Zeichen, nur gut für ID-Werte unter 33 Millionen

Pros: benötigt keinen Schlüssel zum De-obfuscate, URL / Cookie-freundlich, generiert jedes Mal einen anderen Wert, der es schwerer macht zu brechen, keine Kollisionen, enthält eine Prüfsummenfunktion, um zufällige / rohe Gewaltversuche zu beseitigen ( ein Problem, dass die oben genannten Post nicht adressieren, ist Menschen, die versuchen, Ihre Website zu "kratzen". Wenn ich eine URL-Endung in ID = 123 Ich weiß, ich kann versuchen ID = 124 etc ... um zusätzliche Daten zu erhalten, deshalb einige der XOR-Beispiele sind wahrscheinlich keine gute Idee)

Ich würde empfehlen, dies ein wenig zu verbessern (was ich für meinen gemacht habe), da ich nicht glaube, dass Sie jemals eine öffentlich veröffentlichte Verschleierungstechnik verwenden sollten, aber es ist ein guter Anfang.

Glückliche Kodierung!

%Vor%     
Richard Varno 06.10.2015 18:11
quelle
-2

Erhalte nur einen MD5 / SHA1-Hash der Integer-Byte-Darstellung. Sie werden garantiert keine Kollisionen bekommen.

    
logicnp 02.04.2010 09:04
quelle