2014-09-26 12 views
5

NodeJS und Krypto Verwendung, gerade jetzt, wenn sich ein Benutzer anmeldet, ich ein zufälliges Auth-Token erzeugen:Generieren von eindeutigen Token in einem NodeJS, Crypto Token-Authentifizierungsumgebung

var token = crypto.randomBytes(16).toString('hex'); 

Ich weiß, es unwahrscheinlich ist, aber es gibt eine sehr kleine Chance, dass zwei Tokens den gleichen Wert haben.

Dieser Meas könnte ein Benutzer theoretisch auf einem anderen Konto authentifizieren.

Nun, ich sehe zwei offensichtliche Methode, um diese passieren:

  • Wenn ich das Token generieren, fragen Sie die Benutzer-Datenbank und sehen, ob ein Token mit dem gleichen Wert bereits vorhanden ist. Wenn dies der Fall ist, generieren Sie einfach einen anderen. Wie Sie sehen können, ist dies nicht perfekt, da ich der Datenbank Abfragen hinzufüge.
  • Da jeder Benutzer einen eindeutigen Benutzernamen in meiner Datenbank hat, konnte ich
    ein zufälliges Token mit dem Benutzernamen als geheimer Generatorschlüssel generieren. Auf diese Weise gibt es keine Möglichkeit, dass zwei Token den gleichen Wert haben. Kann
    Krypto das tun? Ist es sicher?

Wie würden Sie es tun?

Antwort

8

Es ist zu unwahrscheinlich, dass man sich darum sorgen muss, dass es zufällig passiert. Ich würde Leistung nicht opfern, um die Datenbank dafür zu sperren und zu überprüfen.

Betrachten Sie diesen Auszug aus Pro Git über die Möglichkeit von Kollisionen zwischen 20-Byte-SHA1 Summen:

Hier ein Beispiel ist Ihnen eine Vorstellung davon zu geben, was sie bekommen eine SHA1 Kollision nehmen würde. Wenn alle 6,5 Milliarden Menschen auf der Erde programmieren, und jede Sekunde, produziert jeder Code, der dem gesamten Linux-Kernel-Verlauf entspricht (1 Million Git-Objekte) und in ein enormes Git-Repository pushen würde 5 Jahre bis das Repository enthielt genug Objekte, um eine 50% ige Wahrscheinlichkeit einer Einzel-SHA-1-Objektkollision zu haben. Es gibt eine höhere Wahrscheinlichkeit [für durchschnittliche Projekte], dass jedes Mitglied Ihres Programmierteams von Wölfen in nicht verwandten Vorfällen in derselben Nacht angegriffen und getötet wird.

Wenn Sie sind immer noch besorgt über diese Wahrscheinlichkeit, können Sie mehr zufällige Bytes statt 16

Aber in Bezug auf Ihre zweite Idee verwenden: Wenn Sie die Zufalls-ID mit dem Benutzernamen gehasht, dann könnte das Hash kollidieren , genau wie die zufällige ID könnte. Du hast nichts gelöst.

+0

Du hast mir gerade noch eine andere Idee ... wenn sich der Benutzer anmeldet, werde ich für die Nutzer suchen, dass bestimmte Token hat .. wenn die Abfrage findet mehr als ein Ergebnis, lassen Sie den Benutzer einfach neu einloggen - so kann ich auch das schlimmste Szenario verarbeiten - was denken Sie? –

+1

Die Wahrscheinlichkeit, dass Ihr Server zufällig eine Kollision in Tokens zwischen zwei Benutzern generiert, ist viel geringer als die Wahrscheinlichkeit, dass ein motivierter böswilliger Benutzer das Token eines anderen Benutzers erraten würde. Wenn Sie glauben, dass der erste Fall ein potenzielles Problem ist, dann sollten Sie glauben, dass der zweite Fall eher ein Problem ist und adressieren Sie ihn, indem Sie mehr zufällige Bytes verwenden. Wenn Sie glauben, dass 16 Byte wahrscheinlich ausreichen, um einen motivierten Brute-Force-Angreifer davon abzuhalten, das Token eines Zielbenutzers zu erraten, sollte es folgen, dass 16 Byte ausreichen, um zu verhindern, dass Ihr Server eine Kollision generiert. – AgentME

+0

ehrfürchtige Antwort im Allgemeinen zu crypto – hauron

0

Sie sollten immer eine UNIQUE Einschränkung zu Ihrer Datenbankspalte hinzufügen. Dadurch wird ein impliziter Index erstellt, um die Suche nach dieser Spalte zu verbessern, und es wird sichergestellt, dass keiner von zwei Datensätzen den gleichen Wert hat. Im schlimmsten Fall erhalten Sie also eine Datenbankausnahme und keine Sicherheitsverletzung.

Abhängig davon, wie oft eindeutige Token erstellt werden müssen, ist es in den meisten Fällen völlig in Ordnung, während der Generierung Datenbanksuchen zu verwenden.Wenn Ihre Spalte wieder richtig indiziert ist, wird es eine ziemlich schnelle Abfrage sein. Die meisten Datenbanken sind sehr gut horizontal skalierbar, also wenn Sie ein nächstes Facebook erstellen, ist es wieder eine Option. Darüber hinaus müssen Sie wahrscheinlich eine Abfrage durchführen, um die E-Mail-Eindeutigkeit zu überprüfen.

Wenn Sie wirklich an der Leistung interessiert sind, können Sie immer eine Million eindeutiger Tokens vorgenerieren und sie in der separaten Datenbanktabelle für die schnelle Verwendung speichern. Richten Sie einfach eine Routine ein, um die Verwendung regelmäßig zu überprüfen und bei Bedarf weitere Datensätze einzufügen.

Verwandte Themen