2009-04-21 17 views
0

Stellen Sie sich einen Wert vor, sagen wir "1234". Ich möchte diesen Wert einem anderen Wert zuordnen, sagen wir "abcd". Die Constraints:Zuordnung eines Wertes zu einem anderen Wert und zurück

  1. Die Länge des Zielwertes ist gleich dem Startwert
  2. Die Zuordnung eindeutig sein sollte. Z.B. 1234 sollte nur abcd und viseversa zugeordnet werden
  3. Der Mapping-Prozess sollte (sehr) schwer zu erraten sein. Z.B. mit 2 multipliziert sollte nicht zählt
  4. Die Abbildung
  5. Der Startwert eine ganze Zahl
  6. Der Zielwert kann von jeder Art sein

Dies sollte ein Grundalgorithmus sein, schließlich reversible werde ich schreibe es in Ruby, aber das ist hier egal.

ich entlang der folgenden Zeilen dachte:

SECRET = 1234 
def to(int) 
    SECRET + int * 2 
end 

def fro(int) 
    (int - SECRET)/2 
end 

Offensichtlich verletzt Constraints 1 und 3

Das Fernziel ist Datensätze in der Datenbank anonymisieren. Ich könnte darüber nachdenken.

+1

Kurze Frage beiseite: Wie stellen Sie sicher 1, wenn Sie 6 gleichzeitig sicherstellen wollen? – Joey

+2

Stört es Sie, wenn jemand anderes hackt, welcher Algorithmus verwendet wird? Ein simples Hashing (wie Sie es vorschlagen) ist leicht zu knacken und beeinträchtigt die Anonymität der Daten. Je nach Ihrem Bedarf empfehle ich Ihnen, Einweg-Hashes zu betrachten. – dirkgently

+0

Ja, es würde mich stören, wenn jemand den Algorithmus hackt. Ein bisschen wirklich. Und ich weiß, dass meine Lösung inakzeptabel ist, darum habe ich gefragt. Und ich glaube nicht, 1 und 6 Konflikt. Punkt 1 legt nur eine Einschränkung fest. Punkt 6 kann fallen gelassen werden. Mit Typ I bedeuten Integer, Char usw. – harm

Antwort

4

Zunächst denke ich, dass Ihre Ziele zu ehrgeizig sind: Warum Constraint 6?

Zweitens, was Sie brauchen, ist technisch eine bijection aus der Domäne von ganzen Zahlen.

Drittens geht Ihre Einschränkung 3 gegen Kerkhoff's principle. Sie wären mit einem bekannten Algorithmus besser beraten, der von einem geheimen Schlüssel gesteuert wird, wobei der geheime Schlüssel schwer abzuleiten ist, selbst wenn Sie die Ergebnisse für eine große Menge von Ganzzahlen kennen.

Viertens, wofür anonymisieren Sie? Wenn Sie mit persönlichen Informationen zu tun haben, wie werden Sie vor statistischen Analysen schützen, die zeigen, dass Xyzzy tatsächlich John Doe ist, basierend auf den Beziehungen zu anderen Daten? Es gibt einige Nachforschungen zur Bekämpfung solcher Angriffsvektoren (googeln Sie zum Beispiel nach 'k-anonymization').

Fünftens, verwenden Sie vorhandene kryptografische Primitive, anstatt zu versuchen, Ihre eigenen zu erfinden. Es gibt Verschlüsselungsalgorithmen (z. B. AES in cipher-block-chaining), die gut getestet sind - AES wird von allen modernen Plattformen, vermutlich auch Ruby, gut unterstützt. Die Verschlüsselung bietet jedoch immer noch keine Anonymität in einem starken Sinne.

+0

Gut danke! Offensichtlich kenne ich wenig von diesem Bereich, Sie haben genug Material für den Rest des Tages gegeben. Ich erwartete, dass Ihr fünfter Punkt angehoben wird, aber ist einige nicht besser als nichts? Die Aufzeichnungen gehen möglicherweise über eine unverschlüsselte Zeile (kann nicht helfen) und die "Gelegenheit" zu stehlen sollte so klein wie möglich sein. – harm

+0

+1 Jetzt "das" ist beeindruckend. –

+0

Einige können besser als nichts sein, aber auch schlechter, wenn z.B. ROT13-Level-Verschlüsselung erzeugt ein falsches Gefühl der Sicherheit ... Haben Sie Angst, dass die Lernschwelle der Verwendung von Standard-Verschlüsselungsalgorithmen zu hoch sein wird? Ich bezweifle es, aber sehen Sie es so an: Ihre Lösung ist nicht nur gegen mehr Angriffe sicher, sondern Sie haben beim nächsten Mal, wenn Sie Sicherheitsprobleme angehen müssen, etwas viel Nützlicheres gelernt. Eigenentwickelte Lösungen scheitern in beiden Fällen leider! –

1

Es könnte sich lohnen, Ihnen ein wenig mehr zu geben, was Sie versuchen zu erreichen. Vermutlich machen Sie sich Sorgen, dass ein böser Mensch Ihre Daten bekommt, aber ist es nicht gleichermaßen möglich, dass dieser böse Mensch auch Zugriff auf den Code hat, der auf Ihre Datenbank zugreift? Was hält sie davon ab, den Algorithmus zu lernen, indem Sie Ihren Code überprüfen?

Wenn Sie wirklich die Daten anonymisieren möchten, dann ist das in der Regel eine Einbahnstraße (Namen werden entfernt, Kreditkartenwerte werden entfernt usw.). Wenn Sie versuchen, den Inhalt der Datenbank zu verschlüsseln, bieten viele Datenbank-Engines gut getestete Mechanismen, um dies zu tun.Zum Beispiel:

Best practices for dealing with encrypted data in MSSQL

database encryption

Es ist immer besser, ein Produkt der Verschlüsselungsmechanismus zu verwenden, als Ihre eigene Rolle.

+0

Die Datenbank und der Code sind separate Systeme. Die Kompromittierung der Datenbank bedeutet nicht unbedingt eine kompromittierte Code-Basis. Ich möchte so gut wie ich die Daten in unsicheren Übertragung an den Client sichern, ohne unwiderruflich Daten zu verlieren. Sobald ich weiß, dass die Verbindung sicher ist (HTTP vs HTTPS) möchte ich in der Lage sein, die ursprünglichen Daten zu senden. – harm

+0

OK. Also ist Ihre Frage rund um die Verschlüsselung von Daten über den Draht statt die Daten in der Datenbank saß? –