Si vous disposez d'un générateur de nombres aléatoires cryptographiquement sécurisé, vous n'avez pas besoin de hacher sa sortie. En fait, vous ne voulez pas le faire. Utilisez simplement
$token = openssl_random_pseudo_bytes($BYTES,true)
Où $BYTES est le nombre d'octets de données que vous voulez. MD5 a un hachage de 128 bits, donc 16 octets suffiront.
Par ailleurs, aucune des fonctions que vous appelez dans votre code original n'est cryptographiquement sûre, la plupart sont suffisamment dangereuses pour que l'utilisation d'une seule d'entre elles ne soit pas sécurisée, même si elle est combinée avec d'autres fonctions sécurisées. MD5 a des problèmes de sécurité (bien que pour cette application ils ne soient pas pertinents). Uniqid ne génère pas d'octets cryptographiquement aléatoires par défaut (puisqu'il utilise l'horloge système), l'entropie supplémentaire que vous transmettez est combinée à l'aide d'un générateur linéaire congruent, qui n'est pas cryptographiquement sûr. En fait, cela signifie probablement que quelqu'un pourrait deviner toutes vos clés API s'il avait accès à quelques-unes d'entre elles, même s'il n'avait aucune idée de la valeur de l'horloge de votre serveur. Enfin, mt_rand(), que vous utilisez comme entropie supplémentaire, n'est pas non plus un générateur de nombres aléatoires sûr.