Wie erstelle ich die Unique Order Id (nur um touser anzuzeigen) mit der tatsächlichen Order ID?

7

BEARBEITEN WIEDER: Ich möchte keine weitere Frage stellen, also frag hier. Ich habe die gleiche Situation. Aber diesmal brauche ich den Algo in C-Sprache. Kann mir irgendein Körper helfen?

Ich habe folgende Tabelle.

%Vor%

Ich möchte eine eindeutige Bestell-ID generieren (nur um sie dem Benutzer anzuzeigen), damit der Benutzer nicht erraten kann, was die nächste Bestell-ID sein wird.

  

Wie kann ich diese einzigartige zufällige Reihenfolge bekommen?   ID von ursprünglicher Bestellung wenn

     

und erhalten Sie die ursprüngliche Bestell-ID von   diese zufällige Bestellnummer?

BEARBEITEN: Ich möchte kein anderes Feld erstellen.

    
Gaurav 22.03.2011, 06:51
quelle

7 Antworten

9

Wenn Ihre Anforderungen sind:

  • Es muss reversibel sein (d. h. nur die "zufällige" ID, Sie können die ursprüngliche order_id)
  • finden
  • Keine zusätzlichen Spalten
  • Sie möchten die ursprüngliche / interne order_id dem Benutzer überhaupt nicht anzeigen

Dann würde ich eine Art Zwei-Wege-Verschlüsselung empfehlen. Hashing wird nicht funktionieren, da Sie den ursprünglichen Wert nicht von einem Hash finden können.

Ich füge auch hinzu, dass es menschenfreundlich sein sollte, z. jemand kann es über das Telefon zu dir rufen

Ich werde eine sehr einfache Zwei-Wege-Verschlüsselungsklasse verwenden hier , das von Tony Marston geschrieben wurde.

Wir möchten, dass die Lösung menschenfreundlich ist, also entfernen wir einige der Scramble-Zeichen. Ich habe nur Großbuchstaben, Zahlen und die Leerzeichen und Bindestrich-Symbole verlassen. All dies kann leicht unter Verwendung des standardmäßigen phonetischen Alphabets kommuniziert werden, und die erzwungene Verwendung von Großbuchstaben beseitigt jegliche Verwirrung darüber, was ein Zeichen ist.

Das sind die Scramble-Strings, die ich benutzt habe (ich habe diesen Online-Word-Scrambler verwendet, anstatt selbst die Saite zu scramblen) :

%Vor%

Der Code zum Erstellen unserer benutzerfreundlichen Bestell-ID lautet also:

%Vor%

(Sie müssen die * encryption_class * -Datei lokal herunterladen und speichern und einbinden).

Ich habe diesen Code über die Befehlszeile ausgeführt und folgende Ausgabe erhalten:

%Vor%

Jetzt haben wir unsere kurze, menschenfreundliche order_id, die in einer URL wie Ссылка verwendet werden kann , und Sie müssen die interne order_id Ihren Benutzern niemals anzeigen oder mitteilen.

Hinweise:

Der verschlüsselte Code wird einmalig sein, wenn Ihre order_id eindeutig ist (da es eine PK ist)

Dies sollte nicht als Passwortverschlüsselungs- / Entschlüsselungsroutine verwendet werden - keine Passwörter speichern, Hashes speichern.

Stellen Sie sicher, dass Ihr geheimer Schlüssel zufällig und komplex ist und nur die Zeichen in Ihren $ scramble-Variablen enthält.

Es verschleiert nur die order_id.

Bearbeiten:

Obwohl das Auffüllen der Eingabezeichenfolge (order_id) eine gewisse Menge an ramdomness erzeugt, können Sie dies mit der Antwort von @ biakaveron kombinieren, um eine URL wie Ссылка

    
Shane O'Grady 30.03.2011, 18:57
quelle
9
  1. Erstelle deinen geheimen Schlüssel (eine beliebige Zeichenfolge) und speichere ihn in deinen Konfigurationsdateien (oder der DB-Konfiguration).
  2. Erstellen Sie eine eindeutige ID: $newId = hash_hmac('sha1', $orderId, $secret_key).'-'.$orderId; . Ihre Bestellseiten werden also wie http://example.com/order/show/123456...absdef-123 aussehen.
  3. Sie können die ursprüngliche Bestell-ID schnell abrufen und überprüfen:
%Vor%

Auf diese Weise ist die ursprüngliche ID öffentlich, aber der Benutzer kann sie aufgrund des unbekannten Hash-Strings (erster Teil der eindeutigen ID) nicht in der Site-Adresse ersetzen.

    
biakaveron 22.03.2011 08:08
quelle
2

Zunächst sollten Sie Ihre order_id als physische ID in Ihrer Datenbank behalten: Dieses Feld ist eine ganze Zahl, es funktioniert gut (Ihr Code ist dafür ausgelegt, - und Ganzzahlen geben bessere Leistungen als String-Keys) .

Aber Sie können ein weiteres Feld hinzufügen , das als Bezeichner für den Benutzer fungiert :

  • Ein varchar(something) oder char(something) Feld, das eine bessere Anzeige erhalten würde und schwerer zu erraten wäre,
  • Es würde dem Benutzer angezeigt werden,
  • Es wäre ein UNIQUE index darauf,
  • Aber es hätte keine technische Bedeutung für Ihren Code.


Ein GUID könnte eine Idee sein - aber ich habe die Befürchtung, dass es das könnte ein bisschen zu lang sein ...

Was ist mit etwas, das auf dem ersten Buchstaben des Benutzernamens, dem Datum und einer Zufallszahl basiert?
Es wäre schwer zu erraten, und hat immer noch eine gewisse Bedeutung für den Benutzer ...

Natürlich können Sie die order_id nicht aus dieser String-ID berechnen - aber wenn diese eindeutig ist, eine einfache Abfrage und Sie erhalten die order_id zurück:

%Vor%     
Pascal MARTIN 22.03.2011 06:58
quelle
0

Sie können es irgendwie schummeln, aber ich würde absolut empfehlen, eine weitere Spalte hinzuzufügen. Hier ist, wie ich es mit PHP machen würde.

%Vor%

Wenn also Ihre tatsächliche Bestell-ID 489 lautet und der aktuelle Zeitstempel 1300778794 lautet, erhalten Sie eine Bestell-ID, die wie 418390 aussieht. Wenn Ihr Kunde diese Bestell-ID dann für irgendetwas verwendet, müssen Sie ihn einfach wieder zurückgeben nach unten:

%Vor%

Dies ist kein sehr ausgefeilter Ansatz und nicht 100% idiotensicher. Aber um Ihre Bestell-IDs sanft zu verschleiern, denke ich, dass es die Arbeit ausreichend erledigt.

Bearbeiten: Sie können auch eine andere Methode zum Generieren einer Semi-Random-Nummer zum Auffüllen der ID mit Ausnahme von time() verwenden. Zum Beispiel könnten Sie rand(pow(10, log10($orderId)), pow(10, log10($orderId)+1)) verwenden, was immer eine Zufallszahl zurückgibt, die die gleiche Länge wie orderId hat.

    
Michael McTiernan 22.03.2011 07:31
quelle
0

Eine andere, wirklich einfache Methode besteht darin, die OrderID zu codieren. Sie übergeben die Base64-codierte ID an den Client anstelle der tatsächlichen ID und dekodieren die ID dann, wenn sie zurückkommt. Ich würde empfehlen, die Gleichheitszeichen vom Ende der codierten Zeichenkette zu entfernen.

Die Vorteile:

  • Wirklich schnelle und einfache Verschleierung der tatsächlichen ID

Nachteile:

  • Sie müssen daran denken, es zu dekodieren
  • Ein schlauer Benutzer würde es leicht verstehen aus
Stephen Perelson 22.03.2011 08:35
quelle
0

$ original_id = [was auch immer];

%Vor%

Sie können die ursprüngliche ID mit substr ($ user_facing_id, 5) zurückerhalten, und Sie können sogar überprüfen, ob es eine gültige Bestell-ID ist, ohne Ihre Datenbank abzufragen, indem Sie die Gleichheit zwischen dechex überprüfen (substr ($ user_facing_id, 0, 5)) und substr (md5 (substr ($ user_facing_id, 5). $ salt).

    
R Hill 29.03.2011 11:53
quelle
0

Wie andere bereits gesagt haben, können Sie einfach einen Hash der Auftrags-ID mit einem bekannten Salz erzeugen - während die Computer sich nicht wirklich darum kümmern, ob die Bestellnummer

ist
  

854bf1176798d77ecaf6b66cbe71a8fc1b0c1847

oder

  

36698

Es gibt einen großen Unterschied, wenn es um Wetware geht.

  

, damit der Benutzer nicht erraten kann, was die nächste Auftrags-ID sein wird.

Was versuchst du wirklich hier zu vermeiden? Ich hätte gedacht, dass Sie nur verhindern wollen, dass Benutzer Bestellungen anderer Leute sehen - in diesem Fall müssen Sie nur die Kombination aus Bestell-ID und Benutzer-ID verwenden, um Bestellungen auszuwählen.

Sicherlich kann das Gesamtvolumen der Bestellungen als sensible Information betrachtet werden - in diesem Fall verwenden Sie einfach eine Sequenznummer, die an die Benutzer-ID gebunden ist. Obwohl Sie nicht explizit angegeben haben, welches DBMS Sie verwenden, nehme ich an, dass es mysql oder ein Derivat ist, das auf der Engine basiert - aber das Folgende gilt auch für die meisten relationalen DBMS:

Wenn Sie der Tabelle, die Benutzer mit dem Standardwert 0 beschreibt, eine Spalte hinzufügen, können Sie in der Auftragstabelle Trigger hinzufügen, um diesen Wert für jede Einfügung in der Auftragstabelle automatisch abzurufen, zu erhöhen und zu aktualisieren - dh keine Änderung erforderlich den Code an anderer Stelle außer der Unterstützung der 'externen' Bestellnummer. Natürlich müssten Sie diesen Wert mit der entsprechenden Anzahl von bereits platzierten Bestellungen säen - so etwas wie ....

%Vor%

(Ich nehme an, ich vermute, dass das oben genannte nicht direkt in MySQL läuft, es mag keine Unterselektionen in der gleichen Tabelle wie ein Update / Löschen - Sie müssen die Logik in eine Prozedur auflösen)

und ....

%Vor%     
symcbean 30.03.2011 12:23
quelle

Tags und Links