2009-05-23 9 views
2

In meinem Programm speichern wir die IP-Adresse eines Benutzers in einem Datensatz. Wenn wir einem Benutzer eine Liste von Datensätzen anzeigen, wollen wir die IP des anderen Benutzers nicht verraten, so dass SHA1 sie hasht. Dann, wenn der Benutzer auf einen Datensatz klickt, geht es auf eine URL wie folgt aus:SQL SHA1 innerhalb WHERE

http://www.example.com/allrecordsbyipaddress.php?ipaddress=SHA1HASHOFTHEIPADDRESS 

Nun, ich muss in der SHA1-Hash angegeben durch die IP-Adresse alle Datensätze aufzulisten. Ich habe das versucht:

SELECT * FROM records 
WHERE SHA1(IPADDRESS)="da39a3ee5e6b4b0d3255bfef95601890afd80709" 

aber das funktioniert nicht. Wie würde ich das tun?
Danke, Isaac Waller

+1

Warum verwenden Sie einfach einen Hash anstelle der IP-Adresse selbst? – Gumbo

+0

Mit diesem Ansatz berechnen Sie die SHA1 aller Adressen in der Datenbank jedes Mal, wenn Sie eine Abfrage ausführen. Das wird erstaunlich langsam und verbraucht riesige Mengen an CPU. – blueshift

Antwort

4

Ich würde speichern Sie die SHA1 der IP in der Datenbank zusammen mit dem rohen IP, so dass die Abfrage

SELECT * FROM records WHERE ip_sha1 = "..." 

Dann würde ich sicher, werden würde, dass die SHA1 Berechnung genau einem Ort geschieht in Code, so dass es keine Möglichkeit gibt, an verschiedenen Stellen etwas anders gemacht zu werden. Dies gibt Ihnen auch die Möglichkeit, ein Salz in die Berechnung zu mischen, so dass jemand nicht einfach den SHA1 an einer IP-Adresse berechnen kann, an der er interessiert ist, und diese von Hand weitergeben.

Speichern der SHA1-Hash die Datenbank gibt Ihnen auch die Möglichkeit, einen sekundären Index auf ip_sha1 hinzuzufügen, um diese SELECT zu beschleunigen. Wenn Sie einen sehr großen Datensatz haben, erzwingt die SHA1 in den WHERE-Klauseln, dass die Datenbank einen vollständigen Tabellenscan ausführt und eine Berechnung für jeden Datensatz bei jedem Scan erneut durchführt.

+0

+1: DRY (Do not Repeat Yourself) ist ein * Schlüssel * -Prinzip und sicherstellen, dass jedes wichtige Stück Daten oder Code nur einmal existiert, dh an "genau einem Ort" wie Sie es sagen, ein wichtiger Teil von DRY. –

+0

Ich brauche die rohe IP-Adresse selbst, möchte sie aber nicht mit der Öffentlichkeit teilen. –

+0

@Isaac Waller: Sie können sowohl die IP als auch ihren Hash in der Tabelle speichern. Das würde die Suche beschleunigen und die Fehlerbehebung vereinfachen. – Andomar

0

Haben Sie die Ausgabe Ihres Hash-Algorithmus mit der Ausgabe von MySQL SHA1() verglichen? Zum Beispiel für die IP-Adresse 1.2.3.4?

3

Jedes Mal, wenn ich eine unerwartete Hashing-Diskrepanz hatte, lag es daran, dass ich versehentlich eine Zeichenfolge mit Leerzeichen wie "\n" hashte.

+0

+1 Richtig ... Ich erinnere mich, dass – Andomar

7

Weiß nicht, ob es wichtig ist, aber Ihr SHA1 Hash da39a3ee5e6b4b0d3255bfef95601890afd80709 ist ein bekannter Hash einer leeren Zeichenfolge.

Ist es nur ein Beispiel oder Sie haben vergessen, eine tatsächliche IP Adresse der Hash-Berechnung-Funktion zur Verfügung zu stellen?

Update:

Hat Ihr Webseiten-Code generieren SHA1 Hashes in Klein?

wird Diese Prüfung nicht in MySQL: diese

SELECT SHA1('') = 'DA39A3EE5E6B4B0D3255BFEF95601890AFD80709' 

In diesem Fall verwenden:

SELECT SHA1('') = LOWER('DA39A3EE5E6B4B0D3255BFEF95601890AFD80709') 

, die erfolgreich sein wird.

Sie können aber auch den SHA1 Hash vorauszuberechnen, wenn Sie die Datensätze in die Tabelle einfügen:

INSERT 
INTO ip_records (ip, ip_sha) 
VALUES (@ip, SHA1(CONCAT('my_secret_salt', @ip)) 

SELECT * 
FROM ip_records 
WHERE ip_sha = @my_salted_sha1_from_webpage 

Dadurch kehren Sie die ursprüngliche IP und ermöglichen die Indizierung von ip_sha, so dass diese Abfrage schnell funktioniert.

+0

Das war nur ein Beispiel. –

3

Nur ein kurzer Gedanke: das ist eine sehr einfache Verschleierung. Es gibt nur 2 mögliche IP-Adressen, also wenn jemand mit technischen Kenntnissen es herausfinden wollte, könnten sie das tun, indem sie alle 4 Milliarden Hashes berechnen, was nicht sehr lange dauern würde. Abhängig von der Empfindlichkeit dieser IP-Adressen sollten Sie eine private Nachschlagetabelle in Betracht ziehen.

+1

Oder ein Salz, mindestens. – blueshift

0

Ich verschlüsselte schließlich die IP-Adressen und entschlüsselte sie auf der anderen Seite. Dann kann ich einfach die rohe IP-Adresse in der SQL-Abfrage verwenden. Außerdem schützt es vor Brute-Force-Angriffen, wie Autocracy gesagt.