Je renouvelais mon abonnement Internet via le portail en ligne de mon FAI. Ce qui m'a frappé, c'est quand je saisissais les détails de ma carte de crédit, je saisissais le type de ma carte de crédit (MasterCard, Visa, AA, etc.), et quand je saisissais les chiffres, il y avait un chiffre que j'avais mal saisi. Lorsque j'ai appuyé sur le bouton Envoyer, le site Web m'a automatiquement signalé une erreur indiquant que le numéro de carte que j'avais entré n'était pas valide. Je sens que cela a été fait localement dans le navigateur et aucune donnée n'a été poussée et vérifiée sur un serveur et renvoyée une réponse.
Ma question est la suivante: existe-t-il une séquence de numéros de chaque fournisseur? Sinon, comment le site Web pourrait-il (localement) connaître le mauvais numéro?
Les numéros CC, ainsi que pratiquement tous les autres numéros importants bien conçus (par exemple, les numéros de compte dans les banques) ont tendance à inclure une somme de contrôle pour vérifier l'intégrité du numéro. Bien qu'il ne s'agisse pas d'une fonction de sécurité (car il est trivial de calculer), un algorithme de somme de contrôle décent peut garantir de toujours échouer si (a) une seule faute de frappe a été faite ou (b) deux chiffres voisins sont échangés, qui sont les deux erreurs les plus courantes lors de la manipulation manuelle. saisir des nombres longs.
http://rosettacode.org/wiki/Luhn_test_of_credit_card_numbers est un exemple d'un tel test.
Si un numéro CC est techniquement correct, il peut ne pas s'agir d'un vrai numéro CC. La méthode pour vérifier cela est simple et compliquée à la fois - généralement, si vous avez un accès approprié, vous pouvez rechercher l'institution émettrice pour chaque plage de numéros de carte, puis vous demandez à l'émetteur [s systèmes de cartes] si ils pensent que c'est une carte valide. Eh bien, la deuxième partie se produit généralement dans le cadre d'un paiement CC, mais la vérification de l'émetteur est parfois effectuée avant cela comme un test étendu; mais pas sur le navigateur client.
Aux États-Unis, ils utilisent l'algorithme de Luhn:
http://en.wikipedia.org/wiki/Luhn_algorithm
Le chiffre de contrôle est obtenu en calculant la somme des chiffres puis en calculant 9 fois cette valeur modulo 10. Sous forme d'algorithme:
Nombre: 4321-5678-7531-456x
(où x
est le chiffre de contrôle).
1. Number: 4 3 2 1 5 6 7 8 7 5 3 1 4 5 6 X
2. Double every second: 8 4 10 14 14 6 8 12
3. Sum digits >9: 8 3 4 1 1 6 5 8 5 5 6 1 8 5 3
4. Sum all digits: 8 + 3 + 4 + 1 + 1 + 6 + 5 + 8 + 5 + 5 + 6 + 1 + 8 + 5 + 3 = 69
5. Multiply sum by 9: 69 x 9 = 621
6. Take value mod 10: 621 mod 10 = 1 => x = 1
Le chiffre de contrôle est 1
et le numéro valide complet est 4321-5678-7531-4561
.
Si vous deviez exécuter à nouveau l'algorithme pour vérifier le nombre, la somme de tous les chiffres de l'étape 4 serait 69 + 1 = 70
. Alors, 70 mod 10 = 0
, donc le nombre est valide selon l'algorithme.
Juste pour être complet: l'algorithme de Luhn a un défaut mineur.
TL; DR: "l'algorithme de Luhn détecte la transposition des chiffres adjacents s'ils ne sont pas 09 ou 90"
Si d1 et d2 sont des chiffres adjacents dans le numéro de carte de crédit (d1! = D2), alors leur contribution à la somme de contrôle est soit f(d1) + d2 ou f(d2) + d1, et s'ils sont transposés, ils sont soit f(d2) + d1 ou f(d1) + d2. Si ces deux sommes sont identiques ou si leur différence est un multiple de 10, alors la somme de contrôle ne fait pas de distinction entre leur transposition.
"Credit Cards" 2007, dans An Introduction to the Mathematics of Money , Springer New York, NY, pp. 101-112.
La fonction f(d)
est le doublement et la somme des chiffres qui peuvent être définis comme suit dans python pour les entiers d
: def f(d): return sum([int(x) for x in str(2 * d)])
Il n'y a pas deux chiffres qui seront zéro mod 10 dans le scénario ci-dessus. La preuve est fastidieuse, mais elle peut être trouvée dans son intégralité dans la ressource suivante dont j'ai tiré la citation ci-dessus.
La plupart (mais pas tous) des schémas de cartes utilisent le test Checksum (Luhn) décrit dans d'autres réponses. Cependant, en outre, certains algorithmes utilisent également (assez basique) la reconnaissance de plage de carte (CRR) basée sur le début du numéro de carte (AKA la plage). Certains vérifient également la longueur de la carte.
Voir par exemple les similitudes dans de nombreux algorithmes décrits sur: - https://stackoverflow.com/questions/72768/how-do-you-detect-credit-card-type-based-on-number