Frage

Ich suche ein System zu entwickeln, in denen ich brauche jeden Benutzer einen eindeutigen PIN-Code für die Sicherheit zuweisen. Der Benutzer wird geben Sie nur diesen PIN-Code als ein Mittel, sich zu identifizieren. So nicht, dass ich der Benutzer einen anderen Benutzer PIN-Code zu erraten, in der Lage sein wollen. Unter der Annahme, die max Benutzer i haben 100000 ist, wie lange sollte dieser Pin-Code sein?

z. 1234 4532 3423

Sollte ich generieren diesen Code über eine Art Algorithmus? Oder soll ich es zufällig generieren?

Im Grunde genommen nicht, ich will Menschen in der Lage sein, andere Völker PIN-Code zu erraten, und es sollte genug Anzahl von Benutzern unterstützen.

Es tut mir leid, wenn meine Frage ein wenig verwirrend klingt, aber würde gerne klären Zweifel.

Vielen Dank.

UPDATE

Nach dem Lesen der ganzen Beiträge unten, ich möchte etwas mehr Details hinzuzufügen.

  1. Was ich versuche zu erreichen ist etwas sehr ähnlich zu einer Rubbelkarte.
  2. Ein Benutzer ist eine Karte gegeben, die er / sie den Stift finden Code kratzen müssen.
  3. Geben Sie nun diesen PIN-Code mit den Benutzer in der Lage sein müssen, mein System zugreifen zu können.

Ich kann nicht zusätzliche Sicherheit (zum Beispiel Benutzername und Passwort) hinzuzufügen, wie dann wird der Benutzer von der Nutzung der Rubbellos abzuschrecken. Ich mag es so schwer wie möglich machen, den PIN-Code innerhalb der Grenzen zu erraten.

thankyou alle für Ihre erstaunliche Antworten wieder.

War es hilfreich?

Lösung

Wenn wir 100.000 Nutzer maximal übernehmen, dann können sie einzigartigen PINs mit 0-99,999 dh haben. 5-stellig.

Dies würde jedoch macht es einfacher, die PINs mit der maximalen Anzahl von Benutzern zu erraten. Wenn Sie die Anzahl der Versuche auf die PIN beschränken können, dann können Sie eine kürzere PIN haben. z.B. maximal 10 Fehlversuche pro IP pro Tag.

Es hängt auch von dem Wert dessen, was Sie schützen und wie katastrophal es wäre, wenn das ungerade heraus tat erhalten.

ich für 9 Stellen gehen würde, wenn Sie es kurz oder 12 Ziffern behalten möchten, wenn Sie ein bisschen mehr Sicherheit von automatisierten erraten.

wollen

die PINs zu erzeugen, ich würde eine hohe Auflösung Version der Zeit zusammen mit einiger Salz und vielleicht auch eine Pseudo-Zufallszahlen erzeugen ein Hash < a /> und mit den ersten 9 oder 12 Ziffern. Stellen Sie sicher, dass es eine vernünftige und zufällige Verzögerung zwischen neuen PIN-Generationen so nicht erzeugen sie in einer Schleife , und wenn möglich, machen sie Benutzer initiiert.

zB. Left (Sha1 (Datetime + Salz + Pseudo-Zufall), 9)

Andere Tipps

4 Zufallszahlen sollte viel sein, wenn Sie es auf einzigartige bekannte Benutzer-ID anhängen (noch Nummer sein könnte) [wie von Starblue empfohlen]

Pseudo-Zufallszahlengenerator sollte auch in Ordnung sein. Sie können diese in der DB unter Verwendung speichern umkehrbar Verschlüsselung (AES) oder Einweg-Hashing

Das Hauptanliegen Sie haben, ist, wie oft eine Person kann falsch Eingabe der Stift, bevor sie gesperrt sind. Dies sollte niedrig sein, sagen etwa drei ... Diese Menschen raten, andere Völker Zahlen zu stoppen.

Alle länger als 6 Ziffern und die Menschen werden sie, oder noch schlimmer werden, zu vergessen, sie auf einem Schreiben von Post-it auf ihrem Monitor beachten.

ein Kundenkonto eröffnen Schlösser mit 3 Fehlversuchen

Unter der Annahme, dann einen 4-stellige Stift sowie eine Benutzer-ID-Komponente UserId (999999) + Pin (1234) gibt Ihnen eine 3/10000 Chance, jemand zu erraten. Ist das akzeptabel? Wenn nicht machen die Stiftlänge 5 und erhalten 3/100000

Darf ich vorschlagen, einen alternativen Ansatz? Schauen Sie sich auf Perfekte Papier Passwörter und die Derivate es dazu aufgefordert werden.

Sie könnten dies nutzen „wie er ist“ one-time-PINs zu erzeugen, oder einfach eine einzelne PIN pro Benutzer zu erzeugen.

Beachten Sie auch, dass doppelte PINs sind nicht von selbst ein Problem: jeder Angriff würde dann nur noch für mehr Benutzer-IDs versuchen

.

(Kilometerstand Warnung. Ich bin definitiv kein Sicherheitsexperte)


Hier ist eine zweite Antwort: von Re-Lektüre, ich nehme an, Sie keine Benutzer-ID als solche wollen - Sie nur einen Satz von ausgegebenen Rubbelkarten zu validieren. Ich gehe davon aus Sie auch nicht alphabetisch PINs verwenden möchten.

Sie müssen eine PIN-Länge so zu wählen, dass die Wahrscheinlichkeit, eine gültige PIN zu erraten ist weniger als 1 / (Die Anzahl der Versuche Sie gegen schützen). So zum Beispiel, wenn Sie eine Million gültigen PINs, und Sie wollen gegen 10000 Vermutungen zu schützen, benötigen Sie eine 10-stelligen PIN ein.

Wenn verwenden Sie John Graham-Cumming Version des vollkommenen Papier Passwörter System können Sie:

  1. Konfigurieren Sie diese für (sagen wir) 10-stellige Dezimalzahl Stifte
  2. Wählen Sie ein Geheimnis IV / der Schlusselphrase
  3. Erzeugen (sagen wir) die ersten Millionen Passwörter (/ PINs)

Ich vermute, dass dies ein allgemeines Verfahren, das verwendet werden könnte, beispielsweise 25-alphanumerisches Produkt-IDs zu erzeugen, zu.

Es tut sie es durch sukzessive Annäherung zu tun; Ich hoffe, das kommt ein bisschen näher zu dem, was Sie suchen.

Es gibt viele gute Antworten bisher: einfach, effektiv und elegant

ich die Anwendung bin zu raten, etwas lotterieähnliche, dass jeder Benutzer eine Rubbelkarte erhält und verwendet sie Ihre Anwendung zu fragen, ob „er hat schon gewonnen!“ Also, aus dieser Perspektive ein paar neue Fragen in den Sinn kommen:

Ist Wahl , oder sein Internet-Äquivalent: Kann ein böswilliger Benutzer Ihre App immer wieder getroffen, sagt all 10-stellige Zahl in Folge zu raten? Wenn das eine Möglichkeit ist, sollten Sie die Anzahl der Versuche von einem bestimmten Ort begrenzen. Ein effektiver Weg, könnte einfach mehr zu beantworten, zu verweigern, als, sagen wir, ein Versuch, alle 5 Sekunden von der gleichen IP-Adresse. Dies macht Maschine gesteuerte Angriffe ineffizient und vermeidet die Aussperrung Problem .

Lockout Problem : Wenn Sie ein Konto sperren dauerhaft nach einer beliebigen Anzahl von Fehlversuchen, Sie sind anfällig für Denial-of-Service-Attacken . Der Angreifer oben könnte effektiv aussperren jeder Benutzer , wenn Sie die Konten nach einer gewissen Zeit wieder aktivieren. Aber das ist nur ein Problem, wenn Ihr PINs einer offensichtlichen Verkettung von Benutzer-ID + Key bestehen, da ein Angreifer alle Schlüssel für einen bestimmten Benutzer-ID versuchen könnte. Diese Technik reduziert auch Ihren Schlüsselraum drastisch, weil nur wenige der PIN-Ziffern wirklich zufällig sind. Auf der anderen Seite, wenn die PIN einfach eine Folge von Zufallszahlen sind, Aussperrung muss nur auf den Quell-IP-Adresse verwendet werden. (Wenn ein Versuch fehlschlägt, kein gültiges Konto betroffen ist, so was würden Sie „sperren“?)

Datenspeicherung : Wenn Sie wirklich eine Art von Lotterie-ähnliche System bauen Sie nur brauchen, um den Gewinn PINs speichern ! Wenn ein Benutzer eine PIN eingibt, können Sie eine relativ kleine Liste von PINs / Preise (oder Ihr Äquivalent) suchen. Sie können zu „verlieren“ und ungültigen PINs behandeln identisch mit einer „Sorry, mehr Glück beim nächsten Mal“ Nachricht oder einen „default“ Preis, wenn die Wirtschaft richtig sind.

Viel Glück!

soll die Frage sein, „wie viele Vermutungen im Durchschnitt erforderlich ist, um einen gültigen PIN-Code zu finden, im Vergleich zu, wie viele Vermutungen Angreifer machen?“

Wenn Sie 100 000 5-stelligen Codes erzeugen, dann natürlich dauert es 1 Vermutung. Dies ist unwahrscheinlich, gut genug zu sein.

Wenn Sie 100 000 n-stellige Codes erzeugen, dann dauert es (n-5) ^ 10 Vermutungen. Um herauszufinden, ob das gut genug ist, müssen Sie überlegen, wie Sie Ihr System auf eine falsche Vermutung reagiert.

Wenn ein Angreifer (oder alle kombiniert Angreifer) 1000 Vermutungen pro Sekunde machen kann, dann eindeutig n muss sein ziemlich groß einen entschlossenen Angreifer zu stoppen. Wenn Sie permanent ihre IP-Adresse nach 3 falschen Vermutungen aussperren, dann, da ein Angreifer gegeben ist unwahrscheinlich, Zugang zu mehr haben, als, sagen wir, 1000 IP-Adressen, n = 9 würde ausreichen, um fast alle Angreifer zu vereiteln. Natürlich, wenn Sie verteilen Angriffe konfrontiert werden, oder Angriffe von einem Botnet, dann 1000 IP-Adressen pro Angreifer ist nicht mehr eine sichere Annahme.

Wenn Sie in Zukunft weitere Codes ausgeben müssen (mehr als 100 000), dann wird offensichtlich machen Sie es leichter, einen gültigen Code zu erraten. So ist es wohl wert einige Zeit verbringen dafür, dass Ihre zukünftigen Bedürfnisse Skalierung, bevor sie auf einer Größe zu fixieren.

Angesichts Ihrer Rubbelanwendungsfall, wenn der Anwender das System für eine lange Zeit verwenden wollen, würde ich empfehlen, sie ermöglicht (oder zwingen sie), ein „Upgrade“ ihre PIN-Code auf einem Benutzernamen und Passwort ihrer Wahl nach der erste Einsatz des Systems. Dann erhalten Sie die üblichen Vorteile von Benutzername / Passwort, ohne zu Verwerfen die Leichtigkeit der ersten Verwendung von nur die Nummer von der Karte eingeben.

Was, wie die Nummer zu generieren - vermutlich jedes Sie erzeugen Sie speichern, wobei in diesem Fall würde ich sagen, erzeugen sie nach dem Zufall und Duplikate verwerfen. Wenn Sie sie jede Art von Algorithmus erzeugen verwenden, und jemand den Algorithmus herausfindet, dann können sie gültigen PIN-Codes herauszufinden. Wenn Sie einen Algorithmus auswählen, so dass es nicht möglich ist, für jemanden, den Algorithmus, um herauszufinden, dann ist das fast ist ein Pseudo-Zufallszahlengenerator (die andere Eigenschaft PRNGs ist, dass sie gleichmäßig verteilt sind, die hilft auch hier, da es es schwieriger zu erraten Codes) macht, in dem Fall, dass Sie sie auch erzeugen könnten nur zufällig.

Wenn Sie Zufallszahlengenerator Algorithmen verwenden, so dass Sie nie PIN wie „00038384882“, beginnt mit 0 (Nullen), weil ganze Zahlen nie mit „0“ beginnen. Ihre PIN mit 1-9 Zahlen außer 0 gestartet werden muss.

Ich habe viele PIN-Nummern zu sehen sind und viele Nullen beginnt, so dass Sie erste Million von Zahlen zu beseitigen. Permutation Notwendigkeit Berechnungen, wie viele Zahlen eliminiert.

Ich glaube, Sie 0-9 Nummern in einem Hash setzen müssen, und durch Zufall von Hash zu erhalten, und der Zeichenfolge PIN-Nummer machen.

Wenn Sie Scratch-Card Typ Pin-Codes erzeugen wollen, dann müssen Sie eine große Anzahl verwenden, etwa 13 Ziffern lang sein; und auch, müssen sie auf Kreditkartennummern ähnlich sein, eine Prüfsumme oder Prüfziffer mit der Zahl selbst eingebettet. Sie müssen einen Algorithmus, um einen Stift zu erzeugen, basierend auf einigen Anfangsdaten, die eine Folge von Zahlen sein können. Der resultierende Stift muss für jede Zahl in der Folge eindeutig sein, so dass, wenn Sie 100.000 PIN-Codes erzeugen müssen sie alle unterschiedlich sein. Auf diese Weise werden Sie in der Lage sein, eine Reihe nicht nur zu validieren, indem sie mit einer Datenbank überprüft, aber Sie können es zuerst überprüfen.

Ich schrieb einmal etwas zu diesem Zweck, kann ich Ihnen den Code nicht aber die allgemeine Idee ist diese:

  • Bereiten Sie einen Raum von 12 Stellen
  • Format die Nummer als fünf Ziffern (00.000-99.999) und entlang des Raumes in einer bestimmten Art und Weise zu verbreiten. Zum Beispiel kann die Zahl 12345 als __3_5_2_4__1 verteilt werden. Sie können die Art und Weise variieren Sie verteilen die Anzahl je nachdem, ob es eine gerade oder eine ungerade Zahl ist, oder ein Vielfaches von 3, etc.
  • auf dem Wert bestimmter Ziffern Basierend, mehr Stellen erzeugen (zum Beispiel, wenn die dritte Stelle selbst, dann eine ungeradee Zahl erstellen und es in dem ersten offenen Raum setzen, sonst eine gerade Zahl erstellen und es in den zweiten offenen setzen Raum, zB _83_5_2_4__1
  • Sobald Sie 6 Ziffern generiert haben, werden Sie nur einen offenen Raum haben. Sie sollten immer den gleichen offenen Raum (zum Beispiel des nächsten zu letzten Platz) verlassen. Sie werden die Prüfziffer an diesem Ort statt.
  • Um die Prüfziffer zu erzeugen müssen Sie einige arithmetische Operationen an der Zahl führen Sie generiert haben, zum Beispiel das Hinzufügen alle Ziffern in den ungeraden Positionen und sie durch eine andere Zahl multipliziert wird, dann alle Ziffern in den geraden Positionen subtrahiert, und schließlich Addition aller Ziffern zusammen (Sie müssen den Algorithmus ein wenig variieren basierend auf dem Wert bestimmter Ziffern). Am Ende haben Sie eine Prüfziffer, die Sie in dem generierten PIN-Code enthalten.

So, jetzt können Sie Ihre generierten PIN-Codes überprüfen. Für einen gegebenen PIN-Code, generieren Sie die Prüfziffer und überprüfen Sie es gegen die in dem Stift enthält. Wenn es in Ordnung ist, dann können Sie die Zahl wieder extrahieren, indem die umgekehrten Operationen durchführen.

Es klingt nicht so gut, weil es wie Sicherheit durch Unklarheit aussieht, aber es ist der einzige Weg, dies zu nutzen. Es ist nicht unmöglich, dass jemand einen PIN-Code zu erraten, aber mit einer Prüfziffer einen 12-stelligen Code zu sein, wird es sehr schwer sein, da Sie 1.000.000.000.000 Kombinationen ausprobieren und Sie nur 100.000 gültige PIN-Codes haben, so dass für jeden gültigen PIN-Code gibt sind 10.000.000 ungültig diejenigen.

Ich sollte erwähnen, dass diese für Einweg-PIN-Codes nützlich ist; nur einmal pro Person verwendet einen dieser Codes, beispielsweise ein Prepaid-Handy aufladen. Es ist keine gute Idee, diese Pins als Authentifizierungs-Token zu verwenden, vor allem, wenn es der einzige Weg ist, jemanden zu authentifizieren (Sie sollten nie jemand authentifizieren nur durch ein einziges Stück von Daten, die sehr minimal ist Benutzername + Passwort)

Es scheint, dass Sie den PIN-Code als das einzige Mittel der Identifizierung für die Benutzer verwenden möchten. Eine praktikable Lösung wäre es, die ersten fünf Ziffern zu verwenden, um den Benutzer zu identifizieren, und fügen Sie vier Ziffern als PIN-Code.

Wenn Sie nicht wollen, PINs speichern sie kann durch Anlegen einer kryptografisch sicheren Hash (SHA1 oder besser) berechnet werden an die Benutzernummer und einen systemweiten Geheimcode.

  

Sollte ich generieren diesen Code über einige   Art Algorithmus?

Nein. Es wird vorhersehbar.

  

oder soll ich es zufällig generieren?

Ja. Verwenden Sie einen Verschlüsselungs Zufallsgenerator, oder lassen Sie die Benutzer ihre eigenen PIN wählen.

In der Theorie 4 Stellen werden viel wie ATM Kartenaussteller verwalten mit nur, dass eine sehr große Gemeinschaft zu unterstützen (und natürlich können sie nicht sein und müssen nicht eindeutig sein). Doch in diesem Fall sollten Sie die Anzahl der Versuche bei der Eingabe der PIN und sperren sie nach, dass viele Versuche, wie die Bänke tun. Und Sie sollten auch den Benutzer erhalten einen Benutzer-ID zu liefern (im ATM-Fall, das ist effektiv auf der Karte).

Wenn Sie sich nicht auf diese Weise beschränkt werden sollen, kann es am besten sein, um die PIN-Idee zu Graben und ein Standard-Passwort zu verwenden (das ist im Wesentlichen, was Ihre PIN ist, nur mit einer sehr kurzen Länge und begrenztem Zeichensatz) . Wenn Sie unbedingt darauf zu Numerik beschränken muß (weil Sie einen PIN-Pad oder etwas), dann erwägen, 4 a (konfigurierbar) Mindestlänge und nicht die feste Länge.

Sie sollten die PIN im Klar überall lagern (zB Salz und Hash es wie ein Passwort), aber die kurze Länge gegeben und begrenzt char gesetzt es immer auf eine Brute-Force-Methode sein verwundbar wird, da eine einfache Möglichkeit, um zu überprüfen, es.

Es gibt verschiedene andere Systeme, die auch verwendet werden können, wenn Sie uns mehr über Ihre Anforderungen sagen können (dies ist ein Web-App? Embedded System? Etc.).

Es gibt einen Unterschied zwischen der PIN eines Zielanwenders zu erraten, und dass von jeder gültigen. Von Ihrem Anwendungsfall, so scheint es, dass die PIN Zugriff auf bestimmte Ressource verwendet wird, zu gewinnen, und es ist, dass Ressource, die Angreifer nach sein können, nicht bestimmte Identitäten von Benutzern. Wenn das tatsächlich der Fall ist, müssen Sie gültigen PIN-Nummern ausreichend spärlich unter allen möglichen Nummern der gleichen Anzahl Ziffern machen.

Wie in einigen Antworten erwähnt, müssen Sie Ihre PIN ausreichend zufällig machen, unabhängig davon, ob Sie es von einem Algorithmus generiert werden sollen. Die Zufälligkeit wird in der Regel durch die gemessen Entropie des PIN.

Nun lassen Sie uns sagen, dass Ihre PIN der Entropie ist N , und es gibt 2 ^ M Benutzer in Ihrem System ( M ) die Wahrscheinlichkeit, dass eine zufällige Vermutung eine gültige PIN ergeben wird, ist 2 ^ {MN} . (Sorry für die Latex-Notationen, ich hoffe, es ist intuitiv genug). Dann von dort aus können Sie feststellen, ob die Wahrscheinlichkeit niedrig genug ist, gegeben N und M oder berechnen die erforderliche N von der gewünschten Wahrscheinlichkeit und M .

Es gibt verschiedene Möglichkeiten, um die PINs zu erzeugen, so dass Sie nicht jede PIN erinnern, müssen Sie erzeugt. Aber Sie werden eine sehr lange PIN benötigen, um es sicherer zu machen. Dies ist wahrscheinlich nicht das, was Sie wollen.

Ich habe dies vor mit PHP und einer MySQL-Datenbank durchgeführt. Ich hatte eine Permutationen Funktion, die zunächst sicherstellen würde, dass die Anzahl der erforderlichen Codes - $ n, endlich $ l, mit der Anzahl der Zeichen, $ c -. Der Lage war, vor dem Start des Generierungsprozesses erstellt werden

Dann würde ich speichern jeden neuen Code in die Datenbank ein und lassen Sie es mir sagen, über UNIQUE KEY Fehler, dass es zu einer Kollision war (duplicate). n Anzahl der gemacht $ erfolgreich erstellt Codes gehen dann halten, bis ich hatte. Natürlich könnten Sie tun dies in Erinnerung, aber ich wollte in einem MS Word-Seriendruck die Codes für die Verwendung halten. Also ... ich dann exportiert sie als CSV-Datei.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top