Générer cryptographique sécurisé jetons
Afin de générer un 32 caractères jeton pour l'accès à notre API, nous utilisons actuellement:
$token = md5(uniqid(mt_rand(), true));
J'ai lu que cette méthode n'est pas cryptographique sécurisé comme il est basé sur l'horloge système, et que openssl_random_pseudo_bytes
serait une meilleure solution, car il serait plus difficile à prédire.
Si c'est le cas, quel en serait l'équivalent du code ressembler?
Je suppose que quelque chose comme cela, mais je ne sais pas si c'est à droite...
$token = md5(openssl_random_pseudo_bytes(32));
Également de ce que la longueur de sens que je dois passer à la fonction?
- Pourquoi md5 bien? Il suffit de convertir le bytestream hex: vous obtenez 32 octets de retour de openssl_random_pseudo_bytes(), le rendu de chacun de ces octets comme une hexvalue avec bin2hex() comme indiqué dans le PHP docs exemples
- Je veux seulement 32 caractères? Comment dois-je procéder?
md5()
génère un 32 chaîne de caractères, mais a seulement 128bits valeur des données qu'il contient.openssl_random_pseudo_bytes()
retourne true données binaires, a donc 32*8 = 256 bits de l'aléatoire. Par la farce de votre de 32 octets chaîne de caractères aléatoires à travers md5, vous êtes effectivement la coupe de sa singularité par une quantité massive.- Donc, est
$token = bin2hex(openssl_random_pseudo_bytes(16));
suffisant ou dois-je besoin d'une boucle de 16 itérations passant 1 comme la longueur, puis en ajoutant dans l'hex d'une chaîne de caractères?
Vous devez vous connecter pour publier un commentaire.
Ici est la bonne solution:
bin2hex(random_bytes($length));
bin2hex(random_bytes($length/2))
parce que vous pouvez avoir 2 caractères hexadécimaux pour chaque octet de sorte que le nombre de caractères sera toujours double$length
sans elle$length
nombre de caractères (plutôt que de se soucier de la taille en octets) vous souhaitez passerrandom_bytes($length/2)
.Si vous souhaitez utiliser openssl_random_pseudo_bytes il est préférable d'utiliser CrytoLib de la mise en œuvre, ce qui vous permettra de générer tous les caractères alphanumériques, coller bin2hex autour de openssl_random_pseudo_bytes sera simplement résultat en vous obtenir Un-F (caps) et de chiffres.
Remplacer chemin/vers/à où vous mettez les cryptolib.php fichier (vous pouvez le trouver sur GitHub à: https://github.com/IcyApril/CryptoLib)
La pleine CryptoLib de la documentation est disponible à: https://cryptolib.ju.je/. Il couvre beaucoup d'autres aléatoire méthodes, en cascade, de chiffrement et de hachage de génération et de validation; mais c'est là, si vous en avez besoin.
openssl_random_pseudo_bytes(16)
chaque octet peut avoir n'importe quelle valeur (de 0 à 255), alors querandomString(16)
chaque octet ne peut avoir de a-z A-z 0-9 qui est de 62 combinaisons par octet. Yup randomString est mieux par la longueur de la chaîne, comme bin2hex est inefficace encodage (50%); une meilleure utilisation debase64_encode(openssl_random_pseudo_bytes(16))
pour une chaîne plus courte et exacte connu nombre d'octets de sécurité (16 dans ce cas, mais de modifier, si nécessaire)+
,/
et=
personnages, donc si vous essayez de générer un convivial jeton (par exemple une clé API), il n'est pas idéal.Si vous avez un point de vue cryptographique sécurisé générateur de nombres aléatoires, vous n'avez pas besoin de hachage elle est sortie. En fait, vous ne voulez pas.
Utilisez simplement
Où $OCTETS est toutefois le nombre d'octets de données que vous souhaitez. MD5 est un de hachage de 128 bits, donc 16 octets de faire.
Comme une note de côté, aucune des fonctions que vous appelez dans votre code original sont cryptographiquement sûr, la plupart sont assez nocif que l'utilisation de seulement un de casser de l'insécurité, même si elle est combinée à assurer d'autres fonctions. MD5 a des problèmes de sécurité(bien que pour cette application, ils peuvent ne pas être pertinentes). Uniqid pas juste de ne pas générer de l'aléatoire cryptographiquement en octets par défaut (car il utilise l'horloge du système), l'ajout d'entropie que vous transmettez est combiné à l'aide d'un linéaire harmonie générateur, ce qui n'est pas cryptographique sécurisé. En fait, cela signifie probablement que l'on pouvait deviner tous vos clés API donné accès à quelques-uns d'entre eux, même s'ils n'avaient aucune idée de la valeur de votre serveur d'horloge. Enfin, la fonction mt_rand(), ce que vous utilisez comme le supplément de l'entropie, n'est pas sécuritaire d'un générateur de nombre aléatoire soit.
Fiables mots de passe, Vous pouvez le faire seulement à partir de ascii caractères a-zA-Z et chiffres de 0 à 9. Faire que la meilleure façon est d'utiliser uniquement du point de vue cryptographique sécurisé méthodes, comme la random_int() ou random_bytes() de PHP7. Reste fonctionne comme base64_encode() Vous pouvez n'utiliser que les fonctions de soutien pour faire la fiabilité de la chaîne et de le modifier pour ASCII caractères.
la fonction mt_rand() n'est pas sécurisé et est très ancienne.
À partir de n'importe quelle chaîne, Vous devez utiliser random_int(). À partir d'une chaîne binaire, Vous devez utiliser base64_encode() pour faire une chaîne binaire fiable ou bin2hex, mais alors Vous aurez coupé octet seulement à 16 positions (valeurs).
Voir ma mise en œuvre de ces fonctions. Il utilise toutes les langues.