Question

Je suis en train de travailler sur une application où les utilisateurs ont à faire un appel et tapez un numéro de vérification avec le clavier de leur téléphone.

Je voudrais être en mesure de détecter si le nombre qu'ils ont le type est correct ou pas.Le système de téléphone n'ont pas accès à une liste de numéros valides, mais au lieu de cela, il permettra de valider le nombre à l'encontre d'un algorithme (comme un numéro de carte de crédit).

Voici certaines des exigences :

  • Il doit être difficile de type valide code aléatoire
  • Il doit être difficile d'avoir un code valide, si je fais une faute de frappe (transposition de chiffres, de mauvais chiffres)
  • Je dois avoir un nombre raisonnable de combinaisons possibles (disons 1M)
  • Le code doit être aussi courte que possible, afin d'éviter les erreurs de l'utilisateur

Compte tenu de ces exigences, comment voulez-vous générer un tel nombre?

EDIT :

@Haaked:Le code doit être numérique parce que l'utilisateur tape avec son téléphone.

@matt b:Sur la première étape, le code est affiché sur une page Web, la deuxième étape est d'appeler et de saisir le code.Je ne sais pas l'utilisateur numéro de téléphone.

Suivi :J'ai trouvé plusieurs algorithmes de vérifier la validité des numéros (Voir cet intéressant Google Code du projet : checkDigits).

Était-ce utile?

La solution

Après quelques recherches, je pense que je vais aller avec le ISO 7064 Mod 97,10 de la formule.Il semble assez solide car il est utilisé pour valider l'IBAN (International Bank account Number).

La formule est très simple:

  1. Prendre un certain nombre : 123456
  2. Appliquer la formule suivante pour obtenir les 2 chiffres de la somme de contrôle : mod(98 - mod(number * 100, 97), 97) => 76
  3. Concat nombre et la somme de contrôle afin d'obtenir le code => 12345676
  4. Pour valider un code, vérifiez que mod(code, 97) == 1

Test :

  • mod(12345676, 97) = 1 => BON
  • mod(21345676, 97) = 50 => MAUVAIS !
  • mod(12345678, 97) = 10 => MAUVAIS !

Apparemment, cet algorithme attire la plupart des erreurs.

Une autre option intéressante est la Verhoeff algorithme.Il n'a qu'une vérification des chiffres et est plus difficile à mettre en œuvre (par rapport à la formule simple ci-dessus).

Autres conseils

Pour 1M combinaisons, vous aurez besoin de 6 chiffres.Assurez-vous qu'il n'ya pas accidentellement valide les codes, je vous suggère de 9 chiffres avec un 1/1000 de chance qu'un code aléatoire fonctionne.Je voudrais aussi suggérer d'utiliser un autre chiffre (10 au total) pour effectuer une vérification de l'intégrité.Autant que les modes de distribution, aléatoire suffira et le chiffre de contrôle de s'assurer qu'une seule erreur ne donnera pas un bon code.

Edit: Apparemment, je n'ai pas lu entièrement votre demande.À l'aide d'un numéro de carte de crédit, vous pouvez effectuer une table de hachage sur elle (MD5 ou SHA1 ou quelque chose de similaire).Vous truncate à un endroit approprié (par exemple, 9 caractères) et de le convertir en base 10.Ensuite, vous ajoutez le chiffre de contrôle(s) et ce qui devrait plus ou moins de travail à vos fins.

Vous souhaitez segment de votre code.Partie de celui-ci devrait être un CRC 16 bits du reste du code.

Si tout ce que vous voulez, c'est un numéro de vérification alors il suffit d'utiliser un numéro de séquence (en supposant que vous avez un seul point de génération).De cette façon, vous savez que vous êtes ne pas avoir des doublons.

Ensuite, vous préfixe de la séquence avec un CRC-16 de ce numéro de séquence ET certains de la clé privée.Vous pouvez utiliser n'importe quoi pour la clé privée, aussi longtemps que vous le garder privé.Faire quelque chose de grand, d'au moins un GUID, mais il pourrait être le texte de Guerre et Paix de par le projet Gutenberg.Juste besoin d'être secrète et constante.Avoir une clé privée, empêche les gens d'être en mesure de forger une clé, mais à l'aide d'un 16 bits CR rend plus facile à briser.

Pour valider que vous venez de diviser le nombre en ses deux parties, et ensuite prendre un CRC-16 du numéro de séquence et la clé privée.

Si vous souhaitez occulter la partie séquentielle de plus, puis diviser la CRC en deux parties.Mettre 3 chiffres à l'avant et 2 à l'arrière de la séquence (zéro pad de sorte que la longueur de la CRC est cohérente).

Cette méthode vous permet de commencer avec de petites touches de trop.Les 10 premières touches de 6 chiffres.

A-t-elle être uniquement des chiffres?Vous pouvez créer un nombre aléatoire entre 1 et 1M (je vous suggère de même plus tout de même) et puis Base32 encoder.La prochaine chose que vous devez faire est de Hachage de valeur (à l'aide d'un secret de sel de valeur) et de base32 encoder le code de hachage.Puis ajouter les deux cordes en même temps, peut-être séparés par des tirets.

De cette façon, vous pouvez vérifier en entrant le code de manière algorithmique.Il vous suffit de prendre le côté gauche de la code de hachage à l'aide de votre secret de sel, et de comparer cette valeur à la droite du code.

  • Je dois avoir un nombre raisonnable de combinaisons possibles (disons 1M)
  • Le code doit être aussi courte que possible, afin d'éviter les erreurs de l'utilisateur

Eh bien, si vous voulez qu'elle ait au moins un million de combinaisons, alors vous avez besoin d'au moins six chiffres.C'est que assez court?

Lorsque vous créez le code de vérification, vous avez accès à de l'appelant numéro de téléphone?

Si oui, je voudrais utiliser le numéro de l'appelant et de l'exécuter à travers une sorte de fonction de hachage, de sorte que vous pouvez garantir que le code de vérification que vous avez donné à l'appelant dans l'étape 1 est le même que celui qu'ils pénètrent dans l'étape 2 (pour s'assurer qu'ils ne sont pas à l'aide d'un ami code de validation ou ils ont simplement fait une très chanceux suppose).

Sur le hachage, je ne suis pas sûr si c'est possible de prendre un numéro à 10 chiffres et d'en sortir avec une table de hachage, ce qui ne serait < 10 chiffres (je suppose que vous auriez à vivre avec une certaine quantité de collision) mais je pense que cela permettrait de s'assurer que l'utilisateur est en fait qui ils disent qu'ils sont.

Bien sûr, cela ne fonctionnera pas si le numéro de téléphone utilisé dans l'étape 1 est différent de celui qu'ils appellent à l'étape 2.

En supposant que vous savez déjà comment détecter ce qui touche à l'utilisateur de frapper, cela devrait être faisable assez facilement.Dans le monde de la sécurité, il y a la notion d'un "moment" mot de passe.Cela est parfois appelé une "jetable mot de passe." Normalement ceux-ci sont limités à l' (facilement typables) valeurs ASCII.Ainsi, [a-zA-z0-9] et un tas de facilement typables symboles.comme la virgule, point, point-virgule, et la parenthèse.Dans votre cas, cependant, vous souhaiterez probablement à la limite de la gamme de [0-9] et peut-être inclure * et #.

Je suis incapable d'expliquer tous les détails techniques de la façon dont ces codes sont générés (ou de travail) de manière adéquate.Il y a certains intermédiaires mathématiques derrière elle, que je l'avais boucher sans d'abord examiner moi-même.Il suffit de dire que vous utilisez un algorithme permettant de générer un flux de données des mots de passe.N'importe comment mnay codes précédents, vous savez, celle postérieure doit être impossibel de deviner!Dans votre cas, vous n'aurez tout simplement l'utilisation de chaque mot de passe sur la liste que l'utilisateur code aléatoire.

Plutôt que de ne pas expliquer les détails de la mise en œuvre moi-même, je vais vous diriger vers une page 9 de l'article où vous pouvez lire vous-même: https://www.grc.com/ppp.htm

On dirait que vous avez les non-dits exigence qu'il doit être rapidement déterminé, via un algorithme, que le code est valide.Ce serait la règle, vous donnant une liste de pad numéros.

Il ya plusieurs façons dont les gens ont fait dans le passé.

  1. Faire une clé publique et une clé privée.Coder les nombres de 0 à 999,999 à l'aide de la clé privée, et de la main les résultats.Vous aurez besoin de jeter un peu de nombres aléatoires pour rendre le résultat pour la version longue, et vous aurez à convertir le résultat en base 64 pour la base 10.Lorsque vous obtenez un numéro entré, le reconvertir en base64, appliquer la clé privée, et de voir si le intereting chiffres sont, en vertu de 1 000 000 (jeter les nombres aléatoires).
  2. L'utilisation d'un réversible de la fonction de hachage
  3. Utiliser le premier million de nombres à partir d'un PRN ensemencées à une valeur spécifique.La "vérification" de la fonction peut obtenir de la graine, et de savoir que la prochaine millions de valeurs sont bonnes.Il peut générer à chaque fois et de vérifier un par un lorsqu'un code est reçu, ou au démarrage du programme stocker toutes dans un tableau trié, puis utiliser les binaires de recherche (maximum de compare) depuis un million d'entiers n'est pas un ensemble de beaucoup d'espace.

Il y a un tas d'autres options, mais celles-ci sont fréquentes et faciles à mettre en œuvre.

-Adam

Vous lié à l' les chiffres de contrôle projet, et à l'aide de la "coder" la fonction semble être une bonne solution.Il dit:

encoder peut lever une exception si le "mauvais" des données (par ex.non numériques) est passé, tout en vérifier uniquement renvoie true ou false.L'idée ici est que encoder normalement il obtient les données d' "de confiance" sources internes (une clé de base de données par exemple), de sorte qu'il devrait être à peu d'habitude, en fait, d'exceptionnel, que de mauvaises données est transmis.

Il semble donc qu'il était possible de transmettre le coder la fonction d'une clé de base de données (à 5 chiffres, par exemple) et vous pourriez obtenir un nombre qui réponde à vos besoins.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top