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?
InformationsquelleAutor fire | 2013-09-16