7
votes

Comment générer un identifiant de commande unique (juste pour afficher un tableau) avec ID de commande réel?

modifier à nouveau: je ne veux pas créer une autre question, alors demandez ici. J'ai la meme situation. Mais cette fois, j'ai besoin de l'algo en langage C. Quelqu'un peut-il m'aider?

J'ai suivi de la table. xxx

Je veux générer un identifiant de commande unique (juste pour montrer à l'utilisateur). Cet utilisateur ne peut pas deviner quel sera l'identifiant de commande suivant.

Comment puis-je obtenir cet ordre aléatoire unique ID de l'ordre d'origine si

et récupérer l'identifiant de commande d'origine de cet identifiant de commande aléatoire?

Edit: Je ne veux pas créer d'autre champ.


2 commentaires

Si un utilisateur donné ne peut voir que leurs commandes, alors deviner la commande suivante ne devrait pas être un problème. Si toutes les commandes sont publiques, vous seriez mieux à partir d'une perspective de performance, de maintenance et d'effort, d'ajouter simplement une colonne unique qui prend une valeur randomisée ou à tout le moins ajouté une table de mappage de valeurs randomisées aux commandes. Pourquoi la solution la plus évidente la plus simple ne soit-elle pas sur la table?


Votre édition a considérablement changé la question. Si vous rencontrez des difficultés à mettre en œuvre l'algorithme dans une autre langue, vous devriez poster une question posée à ce sujet, avec les progrès que vous avez déjà faits.


7 Réponses :


2
votes

Tout d'abord, vous devriez conserver votre COMMAND_ID en tant qu'acturier physique de votre base de données: ce champ est un entier, cela fonctionne bien (votre code est Conçu pour utiliser cela - et les entiers donnent de meilleures performances que les touches de chaîne) .

Mais vous pouvez ajouter un autre champ qui servirait d'identifiant pour l'utilisateur :

  • A varchar (quelque chose) ou char (quelque chose) champ, qui obtiendrait un meilleur affichage et serait plus difficile à deviner,
  • Il serait affiché à l'utilisateur,
  • Il y aurait un index unique sur celui-ci,
  • Mais cela n'aurait aucune signification technique pour votre code.


    Un GUID pourrait être une idée - mais je Demandez à la falurie que cela pourrait être un peu trop long ...

    Qu'en est-il de quelque chose basé sur la première lettre du nom de l'utilisateur, la date et un nombre aléatoire?
    Il serait difficile de deviner, et a toujours un peu de signification pour l'utilisateur ...

    Bien sûr, vous ne pourrez pas calculer le commandant_id à partir de cet identifiant de chaîne - mais si si Celui-ci est unique, une requête simple et vous obtiendrez la commande_id back: xxx


3 commentaires

Je ne veux pas ajouter une autre colonne à ma table.


@Gaurav: Et il n'y a pas d'autre moyen de le faire efficacement sans colonne de table bonne chance


@Gaurav vous devriez vraiment: garder la clé primaire entière est bonne d'un point de vue technique.



0
votes

Vous pouvez le défaire un peu, mais je recommanderais totalement d'ajouter une autre colonne. Voici comment je le ferais avec PHP.

$newOrderId = explode("", (string)$newOrderId);
$length = sizeof($newOrderId);
$oldOrderId = "";
for ($i = 0; $i < $length; $i = $i + 2) {
    $oldOrderId .= $newOrderId[$i];
}
$oldOrderId = (int)$oldOrderId;


2 commentaires

Cette solution n'est pas vraiment conviviale, car l'identifiant de commande sortiradi sera différent à chaque fois que la valeur des temps () changements. Bien que possible, il est possible d'inverser l'obfuscation, il confondra l'utilisateur si l'identifiant de commande continue de changer tout le temps.


@Rineme: Utilisez ensuite UNIX_TIMESTAMP ( créé_date ). Pour une raison quelconque, j'ai imaginé qu'il générait un identifiant de commande pour une facture imprimée qui ne serait livrée qu'une fois. Je ne sais pas pourquoi je pensais cela. :)



9
votes
  1. Créez votre clé secrète (n'importe quelle chaîne) et enregistrez votre fichiers de configuration (ou DB config). LI>
  2. Créez une carte d'identité unique: $ Neufid = haash_hmac ('sha1', $ orderid, $ secret_key_key) .- '. $ orderid; code>. Donc, vos pages de commande ressemblent à http://example.com/order/show/123456...absdef-123 code>. li>
  3. Vous pouvez rapidement obtenir un identifiant de commande d'origine et le vérifier: li>
     list($hash, $original) = explode($newId, '-', 2);
     if (hash_hmac('sha1', $original, $secret_key).'-'.$original === $hash)
     {
        // its a correct ID
     }
     else
     {
        // wrong hash, ignore it!
     }
    

2 commentaires

Vous pouvez également ajouter des données spécifiques à l'utilisateur tels que l'utilisateur utilisateur au $ Secret_Key, ainsi que le lien généré ne fonctionnera pas sur un autre ordinateur.


+1 Pour utiliser un HMAC, de sorte que même si l'utilisateur devine la méthode de la commande suivante et , il / elle ne peut pas générer le code opaque et se masquer la demande d'une autre commande. Très bonne réponse.



0
votes

Une autre méthode vraiment simple, c'est la base64 coder la commande. Vous passez l'ID codé de base64 sur le client au lieu de l'ID réel, puis décodez l'identifiant quand il revient. Je recommanderais de supprimer les signes égaux de la fin de la chaîne codée.

Les avantages:

  • Obfuscation vraiment rapide et simple de l'identifiant réel

    Inconvénients:

    • Vous devez vous rappeler de le décoder
    • Un utilisateur intelligent le compromise facilement out

2 commentaires

Downvote avec plaisir, mais dites pourquoi s'il vous plaît. Surtout depuis cette solution, aussi mauvaise que possible, répond effectivement aux exigences de la question.


Vous n'avez pas voté pour votre réponse, mais BASE64 n'est pas sécurisé, car l'utilisateur avancé peut calculer la valeur codée pour chaque identifiant de commande et (probablement) l'accès.



0
votes

$ original_id = [peu importe]; xxx

Vous pouvez obtenir l'identifiant d'origine avec substr ($ user_faCing_id, 5) et vous pouvez même vérifier s'il s'agit d'un identifiant de commande valide sans interrogationner Votre base de données en vérifiant l'égalité entre Dechex (substrub ($ user_faCing_id, 0, 5)) et substrateur (MD5 (substrubère ($ user_faCing_id, 5).


0 commentaires

0
votes

Comme d'autres ont dit que vous pouvez simplement générer un hachage de l'ID de commande avec un sel connu - tandis que les ordinateurs ne se soucient pas vraiment si le numéro de commande est

854BF1176798D77ECAF6B66CBE71A8FC1B0C1847 P> blockQuote>

ou p>

36698 P> BlockQuote>

Il y a une grande différence lorsqu'il s'agit de mouetware. P>

Pour que l'utilisateur ne puisse pas deviner quel sera l'identifiant de commande suivant. P> BlockQuote>

Qu'est-ce que vous essayez vraiment d'éviter ici? J'aurais pensé que vous vouliez simplement empêcher les utilisateurs de voir les commandes d'autres peuples - auquel cas il vous suffit d'utiliser la combinaison de l'ID de commande et de l'identifiant de l'utilisateur pour la sélection de commandes. P>

certainement le volume total de Les commandes peuvent être considérées comme des informations sensibles - dans ce cas, utilisez simplement un numéro de séquence attaché à l'ID utilisateur. Bien que vous n'ayez pas explicitement énoncé que les SGBD que vous utilisez, je suppose que c'est MySQL ou un dérivé basé sur le moteur - mais ce qui suit s'applique également à la plupart des SGBD relationnels: P>

Si vous ajoutez une colonne à la table. Décrire les utilisateurs avec une valeur par défaut de 0, vous pouvez ajouter des déclencheurs sur la table de commande afin de récupérer automatiquement, d'incrémenter et de mettre à jour cette valeur pour chaque insertion sur la table de commande - c'est-à-dire qu'aucun changement requis sur le code ailleurs sauf pour soutenir le "externe" Référence de l'achat. Bien sûr, vous auriez besoin de semer cette valeur avec le nombre de commandes pertinent déjà placé - quelque chose comme .... p> xxx pré>

(Remarque Je suppose que ce qui précède pas. directement dans MySQL, cela n'aime pas les sous-éléments sur la même table qu'une mise à jour / Supprimer - vous devez dérouler la logique dans une procédure) p>

et .... p>

UPDATE buyers b SET buy_ref_last=(SELECT MAX(buyer_order_ref)
     FROM orders o WHERE o.buyer_id=b.id);


0 commentaires

9
votes

Si vos exigences sont:

  • Il doit être réversible (c'est-à-dire donné juste l'ID "aléatoire", vous pouvez trouver le commandal_id)
  • Pas de colonnes supplémentaires
  • Vous ne voulez pas montrer l'original / interne_id_id à l'utilisateur du tout

    Puis je recommanderais une sorte de cryptage à double sens. Le hachage ne fonctionnera pas comme vous ne pouvez pas trouver la valeur d'origine d'un hachage.

    J'ajoute aussi que cela devrait être respectueux des êtres humains par exemple. Quelqu'un peut l'appeler par téléphone sur le téléphone

    Je vais utiliser une classe de cryptage à deux voies très simple située ici , qui a été écrit par Tony Marston.

    Nous voulons que la solution soit favorable à l'homme alors Enlevez certains des caractères de brouillage. Je n'ai laissé que des caractères majuscules, des chiffres et des symboles de l'espace et du tableau de bord. Tous ces éléments peuvent être facilement communiqués à l'aide de l'alphabet phonétique standard et l'utilisation forcée de majuscule élimine toute confusion quant à ce qu'un caractère est.

    Ce sont les chaînes de brouillage que j'ai utilisées (j'ai utilisé Cette Word Online Scrambler plutôt que d'essayer de brouiller la chaîne moi-même): xxx

    Le code pour créer notre identifiant de commande convivial est: xxx

    (Vous devez télécharger et enregistrer le fichier * crypption_class * localement, et inclure-le).

    J'ai couru ce code de la ligne de commande et j'ai reçu la sortie suivante: xxx

    Nous avons notre courte ordonnance respectueuse de l'homme, qui peut être utilisé dans une URL tels que http://myapp.example.com/ord/view/2ud5uik9s , et vous n'avez jamais besoin d'afficher ou communiquer l'ordre interne_id à vos utilisateurs.

    notes:

    Le code crypté sera unique une fois que votre commande est unique. ique (puisque c'est un pk, il sera)

    Ceci ne doit pas être utilisé comme une routine de cryptage / de déchiffrement de mot de passe - Ne stockez pas les mots de passe, stockez les hachages.

    Assurez-vous que votre secret La clé est aléatoire, complexe et contient les caractères uniquement les caractères de votre $ Scramble variables.

    il obfute uniquement.

    Bien que le rembourrage de la chaîne d'entrée (order_id) génère une certaine quantité de ramdomness, vous pouvez la combiner avec la réponse de @ Biakaveron pour créer une URL comme http://myapp.example.com/ord/view/5cc46AEA44E898C3B4E1303EB18D8161302CD367/2UD5UIK9S


4 commentaires

C'est vraiment utile. Je suis désolé qu'il n'y a pas d'option ni retour à la prime récompensée.


Connaissez-vous une algotale similaire en c


J'ai bien peur que non. Cela fait longtemps que j'ai fait une programmation sérieuse en C


$ crypt-> chiffrer ($ clé, $ order_id, $ min_length); Cela ne fait quoi que ce soit pour moi. Toute idée?