2017-08-08 1 views
0

Je construis un système de vote en ligne et par courrier en PHP/Laravel qui nécessite un jeton d'accès qui doit être saisi par une personne à un moment donné, soit l'utilisateur réel ou un administrateur. En tant que tel, je suppose que le jeton doit être généré et non traçable à l'utilisateur d'origine via des vidages de base de données.Comment générer des codes d'accès lisibles par l'homme?

Quelle serait la meilleure façon de générer un tel code? J'ai regardé Hashids, mais je ne sais pas si cela serait une solution appropriée, à moins que ce soit bien d'utiliser l'horodatage de la création du bulletin de vote en secondes comme seconde valeur à utiliser avec l'ID du bulletin.

+0

Si je comprends bien la question que je crois que vous voulez utiliser 'password_encrypt()' avec 'uniqid()' .Vous ajouter la 'password_encrypt() 'ed string que' uniqid() 'génère dans une base de données comme code d'accès que l'utilisateur/administrateur obtiendrait, et quand l'utilisateur/administrateur le saisira, utilisera' password_verify() 'pour vérifier qu'il correspond au champ dans la base de données. – Alesana

+0

@Alesana: C'est une bonne idée, mais le problème avec 'uniqid()' est qu'il est assez long. Je doute que les utilisateurs ciblés veuillent picorer 13 lettres et chiffres avant de marquer leurs bulletins de vote en ligne ou l'administrateur (s) de la même manière lorsqu'ils reçoivent potentiellement plus de 30 bulletins de vote qu'ils doivent entrer manuellement. – Mark

+0

Si vous voulez un identifiant plus court, vous pouvez le faire avec un faible risque de collision (la probabilité que deux identifiants soient les mêmes), mais les risques de collision sont toujours présents. Je recommanderais d'utiliser une fonction de hachage avec l'alogorithme crc32b pour générer un code de 8 caractères. Par exemple, 'hash ('crc32b', uniqid());' – Alesana

Répondre

0

L'un des meilleurs et l'un des plus rapide est la suivante:

$token = bin2hex(openssl_random_pseudo_bytes(int)); 

binaire sûr et cryptographiquement sûr, mais si vous voulez obtenir avec voulu longueur, vous devez couper cela et vous obtiendrez easer pour accrocher jeton fait seulement à partir de 16 caractères. Si vous voulez obtenir une chaîne humaine fiable Vous devez l'implémenter par vous-même et cela est long. J'ai fait quelque chose comme ça en utilisant des extensions cryptographiquement sécurisées SafeToken.

0

Créez un tableau d'octets aléatoire avec un CSPRNG, tel que openssl_random_pseudo_bytes, puis Base58 pour encoder le résultat. Cela donnera la chaîne de caractères utilisable la plus courte pour le niveau d'unicité. Base58 un jeu de caractères très humain utilisable sans caractères facilement confus. Un exemple de cette utilisation est Bitcoin.

Voici le jeu de caractères:
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz