Cet article examine les défis de l'utilisation de la génération de nombres aléatoires dans la cryptographie, mettant en évidence les différences entre PHP 5 et PHP 7. PHP 5 manque de mécanismes facilement disponibles pour générer des nombres aléatoires cryptographiquement sécurisés, tandis que PHP 7 introduit random_bytes
et random_int
fonctions à cet effet.
Comprendre les csprngs
Un générateur de nombres pseudorandom cryptographiquement sécurisé (CSPRNG) est un PRNG conçu pour les applications cryptographiques. Sa caractéristique clé est le caractère aléatoire de haute qualité, crucial pour:
CSPRNGS dans PHP 7
php 7 fournit random_bytes
(renvoyant une chaîne de longueur d'octets spécifiée) et random_int
(renvoyant un entier aléatoire dans une plage donnée) pour la fonctionnalité CSPRNG.
random_bytes
Exemple:
$bytes = random_bytes(10); var_dump(bin2hex($bytes)); // Possible output: string(20) "7dfab0af960d359388e6"
random_int
Exemple:
var_dump(random_int(1, 100)); // Possible output: 27
Ces fonctions utilisent diverses sources d'aléatoire en fonction du système d'exploitation, en hiérarchisant des options sécurisées comme CryptGenRandom
(Windows), arc4random_buf
(BSD), getrandom(2)
(Linux) et enfin /dev/urandom
comme secours. Une erreur est lancée si aucune source appropriée n'est trouvée.
Tester le hasard
L'évaluation de la qualité d'un générateur de nombres aléatoires implique des tests statistiques. Un exemple simple consiste à simuler des rouleaux de dés. La distribution attendue des résultats pour le roulement de trois dés 1 000 000 fois peut être comparée aux résultats réels générés par random_int
et à la fonction standard rand
.
Un exemple de code (simplifié pour la concision) et un graphique comparatif (illustré ci-dessous) démontrent que random_int
présente une distribution plus proche des valeurs attendues, indiquant une aléances supérieure par rapport à rand
.
PHP 5 Alternatives
PHP 5 manque de CSPRNG intégrés. Les solutions de contournement incluent openssl_random_pseudo_bytes()
, mcrypt_create_iv()
ou l'accès direct à /dev/random
ou /dev/urandom
. Des bibliothèques comme Randallib ou Libsodium proposent des solutions supplémentaires.
la random_compat
bibliothèque
Pour la compatibilité PHP 5, la bibliothèque de Paragon Initiative Enterprises random_compat
fournit la fonctionnalité random_bytes
et random_int
. Il peut être installé via le compositeur (composer require paragonie/random_compat
) et utilisé comme suit:
$bytes = random_bytes(10); var_dump(bin2hex($bytes)); // Possible output: string(20) "7dfab0af960d359388e6"
Cette bibliothèque priorise différentes sources d'aléatoire par rapport à PHP 7, en commençant par /dev/urandom
.
Un exemple de génération de mots de passe simple utilisant random_compat
:
var_dump(random_int(1, 100)); // Possible output: 27
Conclusion
L'utilisation d'un CSPRNG est cruciale pour les applications sécurisées. La bibliothèque random_compat
offre une solution compatible en arrière pour PHP 5, tandis que les développeurs PHP 7 devraient utiliser directement random_bytes
et random_int
. La priorisation de la génération de nombres aléatoires fiables améliore considérablement la sécurité des applications.
Description | Link |
---|---|
Die Hard Test | https://www.php.cn/link/1852a2083dbe1c2ec33ab9366feb2862 |
Chi-square test with dice example | https://www.php.cn/link/fb6a253729096c1e92e43c26a6fdadc3 |
Kolmogorov-Smirnov Test | https://www.php.cn/link/030d13e49bb7d1add5ac5ea2e4a43231 |
Spectral Test | https://www.php.cn/link/6bbd80b04535d39be5e02dbfd8730469 |
RaBiGeTe test suite | https://www.php.cn/link/e626afbcdb83368b3491c0c473da19f1 |
Random Number Generation In PHP (2011) | https://www.php.cn/link/f7ff233e4ed3e6b13c5d5c7a9201e4ec |
Testing RNG part 1 and 2 | https://www.php.cn/link/a1c71b134d46d7f7ff00f488874a8d43, https://www.php.cn/link/2e3517ba49c2a7c999b9c8381185ae4e |
Merci à Scott Arciszewski pour leur aide à l'examen par les pairs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!