Eine Menge läuft darauf hinaus, wie lange der Code werden kann, wie schwer Sie es brauchen, um einzigartig zu sein, wie schwer es zu unvorhersehbar sein muss, und wenn Sie eine Liste von gültigen Codes haben.
Länge
Erste-off: einfache mathematische impliziert, dass, wenn Sie eine unendliche Anzahl von eindeutigen zufälligen Zeichenfolgen in der Lage sein zu erzeugen, die einzigartig sind, dass Sie die Länge nicht begrenzen kann der Zeichenfolge (It‘ Ich werde unendlich ...).
Wenn Sie die verwendeten Werte in einer Datenbank speichern müssen, benötigt man normalerweise eine maximale Länge.
Unabhängig, unbegrenzte Länge Saiten schaffen eine Menge Gefahren.
wie einzigartig?
Offensichtlich ist die Verwendung der Zeit nicht sehr einzigartig, aber Sie können Dinge hinzufügen, um Kollisionen immer unwahrscheinlicher zu machen, was die Vorhersage erschwert.
Wenn Sie eine Liste von (aktuell) gültigen Codes haben, können Sie den generierten Code immer gegen die vorhandene Datenbank validieren und einen neuen generieren, falls eine Kollision mit einer aktuell gültigen auftreten sollte.
Offensichtlich ein einfaches ständig steigenden Zähler Einzigartigkeit garantieren, aber es ist nicht praktisch, da es nicht Länge begrenzt ist, extrem vorhersehbar usw.
hart
Typischerweise Authentifizierungscodes vorherzusagen, die erraten werden könnte sind schreckliche Sicherheitsidee. Sie müssen sich dagegen wehren.
alles
Kombination, um alles zu kombinieren, können Sie eine Verkettung einer Zeichenfolge erstellen:
- Eine feste, aber geheime Zeichenfolge (es lang) halten es für eine Passphrase, die macht Ihre Eingabe extrem hart
- IP-Adresse des Clients
- verwendete Portnummer vom Client
- tim erraten e & Datum
- eine Pseudozufallszahl
- die Zeichenfolge der Client selbst
- Benutzername
- ...
Sie müssen alle nehmen, etc., um die Reihenfolge nicht zu identifizieren verwendet liegt ganz bei dir. Je mehr, desto besser.
Sobald Sie diese Zeichenfolge haben, wählen Sie eine Hash-Funktion, je länger die Ausgabe des Hash, desto weniger wahrscheinlich Kollisionen werden, aber desto mehr Speicher wird der Code in Ihrer Datenbank verwenden.
Eine gute Wahl wäre heutzutage Sha-1 oder Sha-256 (MD5 ist ein bisschen zu kaputt, um in irgendetwas Neuem verwendet zu werden).
Dies gibt Ihnen einen Code, der in der Länge festgelegt ist, ändert sich dramatisch, selbst wenn Sie nur ein Bit in der Eingabe ändern, ist nahezu unmöglich für einen Angreifer vorhersagen und hat eine geringe Chance, eine Kollision zu verursachen.
Wie klein? Es ist extrem unwahrscheinlich, siehe die Mathematik hier: https://crypto.stackexchange.com/questions/24732/probability-of-sha256-collisions-for-certain-amount-of-hashed-values
Wenn Sie die Möglichkeit vollständig ausschließen müssen und keine unbegrenzte Länge von Codes erlauben, können Sie es nur gegen die verwendeten Codes überprüfen und sollte es gefunden werden, können Sie generieren ein neuer.
TL; DR
können Sie andere Dinge hinzufügen, abgesehen von der Zeit, z.B. IP-Adresse der Remote-Seite der Verbindung, Pseudo-Zufallszahl, Prozess-ID, eine feste Zeichenfolge, die Sie geheim halten, etc. mixen Sie diese und machen Sie einen Hash unter Verwendung von z. sha-256 und Sie haben eine feste Länge schwer vorhersagbaren Code.
Das Risiko von Kollisionen besteht, aber es ist enorm klein, wenn Sie es genügend Eingabe geben, um es zu beseitigen: überprüfen Sie gegen die Liste der verwendeten Codes.
Dies ist wirklich hilfreich! Danke :) – Michael
Dachte darüber ein bisschen mehr und eine letzte Frage. Ich möchte, dass das Token für diesen Benutzer garantiert eindeutig ist. Ist es eine schlechte Praxis, die Benutzer-ID (nicht den Benutzernamen, aber das einzigartige automatische Inkrement int) dem Ende des Tokens voranzuzählen, wird dies garantieren, dass das Token niemals von a wiederverwendet werden kann anderer Benutzer. Nur ein bisschen vorsichtig, wenn ein Token aktualisiert wird, aber nicht korrekt an die Client-App übergeben wird und der Client versucht, erneut eine Verbindung herzustellen (sehr geringe Wahrscheinlichkeit, dass es passiert), ein anderer Client-Benutzer hat sein Token aktualisiert und weil das Token nicht 't existiere in der db nicht mehr .... – Michael
....., dieser neue Client erhält den gleichen Token Wert auf die Chance, aber dann versucht die Client-App, die nicht das aufgefrischte Token wieder zu verbinden und Da dieser Client jetzt denselben Token hat, da dieser andere Benutzer nun Zugriff auf dieses andere Benutzerkonto hat, ist die Wahrscheinlichkeit gering, aber ich muss alle Anstrengungen unternehmen, um einen möglichen unbefugten Zugriff zu verhindern. Hoffe, das ist klar – Michael