web-dev-qa-db-fra.com

Prédire la production de Rand de PHP ()

J'ai lu dans de nombreuses sources que la production de Rand de PHP () est prévisible comme un PRNG, et j'accepte surtout que comme tout simplement parce que je l'ai vu dans de nombreux endroits.

Je suis intéressé par une preuve de concept: comment allez-y prédire la production de rand ()? De la lecture Cet article Je comprends que le nombre aléatoire est un numéro renvoyé dans une liste à partir d'un pointeur (la graine) - mais je ne peux pas imaginer comment cela est prévisible.

Quelqu'un pourrait-il raisonnablement savoir quel # a-t-il généré via Rand () à un moment donné dans le temps dans quelques milliers de suppositions? Ou même 10 000 suppositions? Comment?

Ceci est à venir car j'ai vu une bibliothèque d'authentification qui utilise Rand () pour produire un jeton pour les utilisateurs qui ont perdu des mots de passe, et j'ai supposé que c'était un trou de sécurité potentiel. Depuis, j'ai remplacé la méthode avec le hachage d'un mélange de openssl_random_pseudo_bytes(), le mot de passe haché orignal et Microtime. Après cela, je me suis rendu compte que si j'étais à l'extérieur en regardant, je n'aurais aucune idée de la façon de deviner le jeton même sachant que c'était un MD5 de Rand ().

21
Erik

La sortie du rand de PHP () est prévisible comme un PRNG

C'est un générateur de congruence linéaire . Cela signifie que vous avez une fonction qui est efficacement: NEW_NUMBER = (A * OLD_NUMBER + B) MOD C. Si vous graphiquez New_Number vs Old_Number, vous commencerez à voir des lignes diagonales. Certaines des notes sur Documentation Rand de PHP Donner des exemples de la façon de le faire.

Ceci arrive parce que j'ai vu une bibliothèque d'authentification qui utilise Rand () pour produire un jeton pour les utilisateurs qui ont perdu des mots de passe, et j'ai supposé que c'était un trou de sécurité potentiel.

Sur une machine Windows, la valeur max de Rand est 2 ^ 15. Cela donne à l'attaquant 32 768 possibilités de vérifier.

Quelqu'un pourrait-il comprendre raisonnablement ce qu'a-t-il généré au hasard via Rand () à un moment donné dans le temps dans quelques milliers de suppositions? Ou même 10 000 suppositions? Comment?

Tandis que - cet article Ce n'est pas exactement celui que vous recherchez, il montre comment certains chercheurs ont pris une mise en œuvre existante d'un générateur de nombres aléatoires et l'utilisaient pour gagner de l'argent sur le Texas Holdem. Il y a 52! Decks mélangés possibles, mais la mise en œuvre utilisait un générateur de nombres aléatoires 32 bits (qui est le numéro maximum de MT_GETRANDMAX sur une machine Windows) et l'a semé avec le temps en millisecondes depuis minuit. Cela a réduit le nombre de ponts mélangés possibles d'environ 2 ^ 226 à environ 2 ^ 27, ce qui permet de rechercher en temps réel et de savoir ce que le pont a été traité.

Après cela, je me suis rendu compte que si j'étais à l'extérieur en regardant, je n'aurais aucune idée de la façon de deviner le jeton même sachant que c'était un MD5 de Rand ().

Je recommanderais d'utiliser quelque chose dans la famille SHA-2 la famille que le gouvernement fédéral considère MD5 cassé. Certaines personnes utilisent Google pour déchiffrer les hachages MD5 car ils sont si courants. Juste hachage quelque chose, jetez le hachage dans une recherche Google - Fondamentalement, Google est devenu un géant table arc-en-ciel .

7
Tangurena

Il est vraiment plus précis de dire qu'à un numéro généré au hasard, le prochain est relativement prévisible. Il n'y a que tant de chiffres que cela puisse être. Mais cela ne signifie pas que vous pourriez le deviner, plus que vous pouviez écrire un programme, assez rapidement.

1
pdr