2016-04-25 4 views
1

Ich versuche, einen dynamischen Avatar für die Benutzer meiner Website zu erstellen. Etwas wie stackoverflow. Ich ein PHP-Skript, das ein Bild auf einer Zeichenkette basierend erzeugt:Kann das MD5 von zwei verschiedenen Strings identisch sein?

path/to/avatar.php?hash=string 

Ich möchte verwenden, um die MD5 der Nutzer E-Mails als Namen ihrer Avatare: (und wie diese Zeichenfolge PHP-Skript erzeugt ein Bild basierend auf)

$email = $_GET['email']; 
$hash = md5($email); 
copy("path/to/avatar.php?hash=$hash","path/img/$hash.jpg"); 

Jetzt möchte ich sicher sein, verwenden kann ich die MD5 ihrer E-Mails als Name ihren avatar? Ich meine, gibt es nicht zwei verschiedene Strings, die identische MD5-Ausgabe haben? Mit anderen Worten möchte ich wissen, ob die Ausgabe von zwei verschiedenen Zeichenketten eindeutig ist?

Ich weiß nicht, meine Frage ist klar oder nicht .. Alles, was ich wissen will, gibt es eine Möglichkeit, die MD5 von zwei verschiedenen E-Mails zu duplizieren?

+0

Ja, es ist möglich, etwa 1 von 1 Billion Chance. – AbraCadaver

+0

@AbraCadaver Nun, wie kann ich eine eindeutige Zeichenfolge generieren? Ich werde nicht auf die ID des Benutzers zugreifen, bevor ich seine Informationen in die Datenbank einfüge. – Shafizadeh

+0

Ein Crypto-Experte wird kommen und korrigieren, aber wenn Sie nur versuchen, die E-Mail-Adresse zu verschleiern, ist die MD5 wahrscheinlich in Ordnung. Sie könnten auch SHA256 oder 512 verwenden. – AbraCadaver

Antwort

2

Da das Ziel hier ist, verwenden Sie einen Hash für seine Eindeutigkeit, anstatt es kryptografische Stärke MD5 ist akzeptabel. Obwohl ich es immer noch nicht empfehlen würde.

Wenn Sie sich für die Verwendung von MD5 entscheiden, verwenden Sie eine global eindeutige ID, die Sie steuern, und nicht eine vom Benutzer angegebene E-Mail-Adresse, zusammen mit einem Salz.

d.h.

$salt = 'random string'; 
$hash = md5($salt . $userId); 

jedoch:

  • es immer noch eine geringe Chance einer Kollision ist (beginnend mit 2 und nähert 2 relativ schnell aufgrund der Birthday Paradox). Denken Sie daran, dies ist eine Chance, Hash n und Hash n + 1 könnte kollidieren.
  • Es gibt keine vernünftige Möglichkeit, die userId aus dem Hash zu ermitteln (ich denke nicht, 128-Bit-Hashwerte zu indizieren, damit Sie sie als sinnvoll abfragen können).

Sie verwenden StackOverflow als ein Beispiel.

Benutzerprofile auf dieser Seite wie folgt aussehen: http://stackoverflow.com/users/2805376/shafizadeh

Also, was mit mit Avatar Urls wie http://your_site/users/2805376/avatar.png falsch ist? Die hintere Ende Lagerung konnte einfach /path/to/images/002/805/376.png

sein Dies garantiert einen eindeutigen Namen, und bietet Ihnen ein sehr einfachen und einfach mit dem Weg zur Arbeit von Speichern, Auffinden und die ID Umkehren, um den Benutzer Bilder zugeordnet zurück.

+0

Gute Erklärungen. Thx ... +1 – Shafizadeh

+0

Auch für diesen Satz: * Also was ist falsch mit avatar URLs wie 'http: //your_site/users/2805376/avatar.png'*. Ich muss sagen, SO verwendet die ID des Nutzers als den Namen seines Avatars. Ich weiß wirklich nicht, wie es das macht, denn wenn der Benutzer nicht auf meiner Website registriert ist, hat er keine ID und ich brauche einen Namen für seinen Avatar, bevor ich ihn registriere. – Shafizadeh

1

Dies ist tatsächlich, was Gravatar tut (das war der Standard Weg, um einen Avatar in Stackoverflow zu bekommen). Schauen Sie sich Gravatars implementation an.

Die Wahrscheinlichkeit einer Kollision ist in der Praxis vernachlässigbar, es ist schwierig genug, absichtlich zwei (binäre) Strings zu fälschen, die dazu führen, dass MD5 und EMails in Größe und Zeichen eingeschränkt sind.

Ein Problem dieses Ansatzes ist, was Fred-ii- erwähnt, weil Brute-Forcing von MD5 so schnell ist (100 Giga MD5 per second), jemand könnte versuchen, die ursprüngliche E-Mail-Adresse zu finden, deren MD5 jetzt sichtbar ist. Für kurze E-Mails würde dies in angemessener Zeit funktionieren.

Die Verwendung einer UUID könnte eine gute Alternative zum Driving von einer EMail-Adresse sein. Sie können eine solche ID ohne Datenbankzugriff erstellen und sicherstellen, dass Sie kein Duplikat erhalten.

+0

Thx ........ +1 – Shafizadeh

Verwandte Themen