2016-05-05 12 views
0

generieren Ich möchte eine eindeutige Zahl aus Zeichenfolge generieren. Die Zeichenfolge ist eine Kombination aus Benutzername und Passwort. Ich möchte aus dieser Kombination eine eindeutige Nummern-ID (keine Zeichenfolge) generieren. Ich md5 zuerst die Kombination und dann wandeln Sie es in Nummer um. Die Nummernlänge muss 10 sein. Irgendwelche Vorschläge?Wie eindeutige Nummer aus Zeichenfolge in node.js

+0

Warum muss es numerisch sein? Verwenden Sie einen db Identitätsspaltenwert? –

+0

Was genau willst du hier bauen? – Thomas

+0

Ursache der Drittanbieter-Dienst erfordert es, Nummer zu sein. –

Antwort

0

Es wäre am besten, wenn Sie weitere Details zu dem Drittanbieter angeben können, mit dem Sie interagieren möchten, da dies eine sehr merkwürdige Anfrage ist und einen grundlegenden Fehler enthält. Sie fragen nach der Nummer eindeutig, aber Sie sind für nur 10 Dezimalstellen ("Nummer ID") Ziffern oder ~ 10 Milliarden möglichen Werte.

Das klingt nach einer Menge, aber es ist wirklich nicht. Dies gibt Ihnen einen Hash von nur über 33 Bits. Der einfache Hash-Kollisionswahrscheinlichkeitsrechner bei http://davidjohnstone.net/pages/hash-collision-probability stellt dies bei einer Wahrscheinlichkeit von 44% für eine Kollision bei nur 100.000 Einträgen. Dies setzt jedoch die volle Nutzung aller verfügbaren Eingabezeichen voraus. Da die Kombinationen aus Benutzername und Passwort fast immer auf alphabetische und numerische Zeichen beschränkt sind, ist die tatsächliche Kollisionswahrscheinlichkeit bei viel weniger Einträgen viel schlechter (kann nicht berechnet werden, ohne die Zeichen zu kennen, die Sie für diese Felder zulassen - aber es ist schlecht).

NodeJS bietet zahlreiche Crypto-Funktionen im crypto Modul. Es steht eine ganze Reihe von Hash-Funktionen zur Verfügung, einschließlich der SHA * -Optional-Case-Optionen. Diese können verwendet werden, um sichere, irreversible Hashes mit astronomischen Kollisionswahrscheinlichkeiten bereitzustellen.

Wenn diese Optionen nicht für Sie verwendbar sind, würde ich vorschlagen, dass Sie einen grundlegenden Designfehler haben. Sie weisen mit hoher Wahrscheinlichkeit eine Benutzer/Kennwort-Kombination einer Benutzer-ID in einem Remote-System zu, so dass ein Angreifer bei einem einfachen Brute-Force-Angriff aufgrund des hohen Kollisionsrisikos in Ihrem Modell leicht Kompromisse eingehen könnte.

Wenn Sie tun, was ich denke, Sie tun, wäre der "richtige" Weg, dies zu tun, eine einfache Datenbank auf einem Server irgendwo zu haben. Dem Benutzer/Pass wird eine eindeutige ID zugewiesen, und es spielt keine Rolle, worum es sich dabei handelt - es könnte sich um ein Autoinkrement-ID-Feld in einer einzelnen MySQL-Tabelle handeln. Der Server würde dann diesen Remote-Dienst mit dem ID-Wert für alle erforderlichen API-Aufrufe kontaktieren und die Ergebnisse an den Benutzer zurückgeben. Dies eliminiert das Sicherheitsrisiko, da der Benutzername/das Passwort nicht wirklich gehackt, nur gespeichert und bei jedem Anruf 100% geprüft werden kann.

Verwenden Sie niemals einen Hash als primären Datenwert. Es ist eine Vereinfachung, kein eigenständiger Wert.

Verwandte Themen