Beste Weg, um zu verhindern, dass doppelte Verwendung von Kreditkarten
Wir haben ein system, wo wir wollen, um zu verhindern, dass die gleiche Kreditkarte Zahl, die registriert werden, für die zwei verschiedene Konten. Da wir nicht speichern Kreditkarten-Nummer intern nur die letzten vier stellen und das Ablaufdatum - wir können nicht einfach vergleichen, Kreditkartennummern und Ablaufdaten.
Unsere aktuelle Idee ist, zum speichern einer hash (SHA-1) in unserem system der Kreditkarten-Informationen, wenn die Karte registriert ist, und vergleichen der hashes, um zu bestimmen, wenn eine Karte zuvor verwendet wurde.
In der Regel ein Salz verwendet wird, um zu vermeiden, Wörterbuch-Attacken. Ich nehme an, wir sind anfällig in diesem Fall, also sollten wir wahrscheinlich speichern ein Salz zusammen mit dem hash.
Tun Sie Jungs sehen, keine Fehler, die in dieser Methode? Ist das ein standard-Weg, dieses problem zu lösen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Machen wir mal ein wenig Mathematik: Kreditkarte zahlen 16 Ziffern lang. Die ersten sieben Ziffern sind die 'großen Industrie' und den Aussteller-zahlen und die Letzte Ziffer ist der luhn-Prüfsumme. Blätter, 8-stellig, 'frei', für eine Gesamtmenge von 100,000,000 Konto zahlen, multipliziert mit der Anzahl der potenziellen Emittenten zahlen (die wahrscheinlich nicht sehr hoch sein). Es gibt Implementierungen, die das tun, Millionen von hashes pro Sekunde auf das alltägliche hardware, also egal, was das Salzen Sie dies tun, ist dies nicht eine große Sache sein, um brute-force.
Durch Zufall, bei der Suche nach etwas geben hash-Algorithmus benchmarks, die ich gefunden dieser Artikel über die Speicherung von Kreditkarten-hashes, die sagt:
Den ganzen Artikel lohnt sich ein gründlicher Lesen. Leider, das Fazit scheint zu sein, dass alle Umstände, die es "sicher" zu speichern Hash-Kreditkarte zahlen, wird es auch teuer für die Suche nach Duplikaten.
Menschen sind über das denken, die Gestaltung dieser, wie ich finde. Verwenden Sie eine salzige, sehr sicher ist (z.B. "rechenintensiv") hash wie sha-256, mit einem pro-Datensatz eindeutig Salz.
Sollten Sie eine low-cost -, hohe Genauigkeit prüfen Sie zuerst, dann tun die hohen Kosten definitiv nur prüfen, wenn Sie, dass der check trifft.
Schritt 1:
Blick für die matches der letzten 4 Ziffern (und ggf. auch die exp. Datum, allerdings gibt es einige Feinheiten gibt, kann es anzugehen).
Schritt 2:
Wenn die einfache Prüfung erwischt, verwenden Sie das Salz, hash-Wert, gehen Sie in die Tiefe schauen.
Den letzten 4 Ziffern der cc# sind die die meisten einzigartig, (teilweise, weil es den LUHN check digit als auch), so dass der Anteil der in der Tiefe überprüft, Sie tun das nicht letztlich übereinstimmen (die falsch-positiv-rate) werden sehr, sehr gering ist (ein Bruchteil von einem Prozent), sparen Sie eine enorme Menge an overhead, die relativ zu der naiven "tun, den hash überprüfen Sie jedes mal, wenn" - design.
Tun nicht store ein einfaches SHA-1 der Kreditkartennummer, wäre es Weg zu leicht zu knacken (vor allem, da die letzten 4 Ziffern bekannt sind). Wir hatten das gleiche problem in meiner Firma: hier ist, wie wir es gelöst.
Erste Lösung
hash(stored_CC1_salt+CC2)==stored_CC1_hash
.Da haben wir grob 100k Kreditkarten in unserer Datenbank, die wir brauchen, zu berechnen, zu 10-hashes, so erhalten wir das Ergebnis in etwa 10 Sekunden. In unserem Fall ist dies in Ordnung, aber Sie können optimieren wollen bcrypt ein wenig nach unten. Leider, wenn Sie tun, diese Lösung wird weniger sicher. Auf der anderen Seite, wenn Sie tune bcrypt, um noch mehr CPU-intensiv ist, dauert es mehr Zeit, um match-CC-Nummern.
Obwohl ich glaube, dass diese Lösung Weg besser als nur das speichern einer ungesalzene hash der CC-Nummer, es wird nicht verhindern, dass eine sehr motivierte Piraten (wer verwaltet, um eine Kopie der Datenbank) zu brechen, eine Kreditkarte, die in einer durchschnittlichen Zeit von 2 bis 5 Jahren. Also wenn man 100k Kredit-Karten in Ihre Datenbank und wenn der Pirat hat eine viel der CPU, dann kann er wiederherstellen kann, ein paar Kreditkarte zahlen jeden Tag!
Dies führt mich zu der überzeugung, dass Sie sollten nicht in die Berechnung der hash selbst: Sie delegieren müssen, dass jemand anderes. Dies ist die zweite Lösung (wir sind in den Prozess der Migration, um diese zweite Lösung).
Zweite Lösung
Einfach Ihre payment-Anbieter erzeugen Sie einen alias für Ihre Kreditkarte.
Es ist einfach, es ist schnell, es ist sicher (naja, zumindest wenn Ihr payment-provider ist). Das einzige problem das ich sehe ist, dass es Bindungen, die Sie zu Ihrem Zahlungsanbieter.
Hoffe, das hilft.
PCI-DSS besagt, dass Sie können speichern Pfannen (Kreditkartennummern) mit einem starken one-way-hash. Sie nicht einmal verlangen, dass es gesalzen werden. Das sagte, Sie sollten Salz mit einem einzigartigen pro Karte Wert. Das Ablaufdatum ist ein guter Anfang, aber vielleicht ein bisschen zu kurz. Man könnte hinzufügen, in andere Stücke von Informationen von der Karte, wie der Emittent. Sollten Sie nicht verwenden die CVV - /security-Nummer, wie Sie sind nicht erlaubt, um es zu speichern. Wenn Sie das Ablaufdatum dann, wenn der Karteninhaber erhält eine neue Karte ausgegeben, mit der gleichen Anzahl zählt es als eine andere Karte. Dies könnte eine gute oder eine schlechte Sache je nach Ihren Anforderungen.
Einen Ansatz, um Ihre Daten sicherer zu machen, ist jeder Betrieb rechnerisch teuer. Zum Beispiel, wenn Sie md5 -, zweimal, es wird ein Angreifer mehr zum knacken des codes.
Seine ziemlich trivial zu generieren gültige Kredit-Karte zahlen und zu versuchen, eine Gebühr für jede mögliche Ablaufdatum. Es ist jedoch rechenintensiv. Wenn Sie es teurer zu knacken, Ihre hashes dann würde es sich nicht lohnen, für niemanden zu stören, auch nicht, wenn Sie hatte die Salze, hashes und die Methode, die Sie verwendet.
@Cory R. König
SHA-1 ist nicht gebrochen, per se. Was der Artikel zeigt ist, dass es möglich ist zu generieren, 2 strings, die den gleichen hash-Wert in weniger als brute-force-Zeit. Sie sind immer noch nicht in der Lage, erzeugen ein string entspricht einem BESTIMMTEN hash in einer angemessenen Höhe der Zeit. Es gibt einen großen Unterschied zwischen den beiden.
Ich glaube, ich habe gefunden ein Narr Beweis Weg, um dieses problem zu lösen. Jemand bitte korrigieren Sie mich, wenn es einen Fehler in meiner Lösung.
So, auch wenn Hacker bekommen Ihre hashes, die Sie bräuchten, um brechen in Ihrem server finden Sie Ihre Formel.
Vergleich von hashes ist eine gute Lösung. Stellen Sie sicher, dass Sie nicht nur Salz alle Kreditkarten-Nummern mit der gleichen Konstanten Salz, aber. Verwenden Sie ein anderes Salz (wie der Ablauf Datum) auf jeder Karte. Sie sollten relativ unempfindlich gegen dictionary-Angriffe.
Vom dieser Coding Horror Artikel:
Fast eine gute Idee.
Speicherung nur der hash ist eine gute Idee, es diente in der Passwort-Welt seit Jahrzehnten.
Hinzufügen einer Salz scheint wie eine Idee, und in der Tat macht eine brute-force-Attacke, die sehr viel schwieriger für die Angreifer. Aber das Salz wird sich kostet Sie eine Menge zusätzlichen Aufwand, wenn Sie wirklich überprüfen, um sicherzustellen, dass eine neue CC ist einzigartig: Sie müssen SHA-1 Ihre neue CC-Nummer N-mal, wobei N die Anzahl der Salze, die Sie bereits verwendet haben, für alle von der CCs, die Sie vergleichen es. Wenn Sie tatsächlich wählen Sie eine gute random-Salze, die Sie haben zu tun, die den hash für jede andere Karte in deinem system. So, jetzt ist es Sie dabei die brute-force. Also ich würde sagen, das ist keine skalierbare Lösung.
Sehen Sie in der Passwort-Welt ein Salz fügt keine Kosten, da wir nur wissen wollen, ob der Klartext + salt-hashes zu dem, was wir gespeichert haben, für diesen bestimmten Benutzer. Ihre Anforderung ist eigentlich ziemlich anders.
Müssen Sie Wiegen die trade-off sich selbst. Die Zugabe von Salz nicht machen Sie Ihre Datenbank sichern, wenn es nicht gestohlen wird, macht es nur die Dekodierung, es ist schwieriger. Wie viel härter? Wenn es änderungen der Angriff von mindestens 30 Sekunden, dass Sie an einem Tag nichts erreicht haben-es wird noch entschlüsselt werden können. Wenn es ändert sich von einem Tag bis zu 30 Jahren haben Sie in unseren Tests etwas überlegung Wert.
Ja, das vergleichen von hashes funktionieren sollte in diesem Fall.
Einer gesalzenen hash sollte gut funktionieren. Mit einem Salz-pro-user-system sollte genügend Sicherheit.
SHA1-Hash ist gebrochen. Natürlich gibt es nicht viel Informationen darüber, was ein guter Ersatz ist. SHA2?
Wenn Sie kombinieren, die letzten 4 Ziffern der Kartennummer mit der Karte name des Karteninhabers (oder nur Nachname) und das Verfallsdatum sollten Sie genug Informationen, um den Datensatz eindeutig. Hashing ist schön für Sicherheits -, aber würden Sie nicht brauchen, um zu speichern/laden Sie das Salz, um zu replizieren, wird der Hashwert für eine Dublettenprüfung?
Ich denke, eine gute Lösung ist, wie oben angedeutet, wäre zum speichern eines hash-Wertes sagen, Kartennummer, Ablaufdatum und name. So können Sie immer noch schnell Vergleiche...
Sha1 - gebrochen ist nicht ein problem hier.
Kaputt bedeutet, dass es möglich zu berechnen, Kollisionen (2 Datensätzen, die den gleichen sha1) leichter, als man erwarten würde.
Könnte dies ein problem für die Annahme, beliebige Dateien basierend auf deren sha1-aber es hat keine relevence für eine interne Hash-Anwendung.
Wenn Sie eine Zahlung Prozessor wie Streifen /Braintree, lassen Sie Sie nicht den "heavy-lifting".
Beide bieten Karte, Fingerabdruck, dass Sie sicher zu speichern in die db ein und vergleichen Sie später um zu sehen, ob eine Karte bereits vorhanden ist:
fingerprint
string - siehe docunique_number_identifier string
- siehe doc