Maison  >  Article  >  développement back-end  >  Fonction CSPRNG en PHP

Fonction CSPRNG en PHP

墨辰丷
墨辰丷original
2018-06-05 13:54:531789parcourir

Cet article présente principalement la fonction CSPRNG en PHP. Les amis intéressés peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

1. Qu'est-ce que CSPRNG

Citant Wikipedia, un générateur de nombres pseudo-aléatoires cryptographiquement sécurisé (Cryptographically Secure Pseudorandom Number Generator, en abrégé CSPRNG) est un nombre pseudo-aléatoire. générateur de nombres aléatoires (PRNG), qui génère des nombres pseudo-aléatoires adaptés aux algorithmes cryptographiques.

CSPRNG peut être principalement utilisé pour :

  • Génération de clés (par exemple, génération de clés complexes)

  • Générer des mots de passe aléatoires pour les nouveaux utilisateurs

  • Système de cryptage

Obtenir un aspect clé de sécurité de haut niveau est le caractère aléatoire de haute qualité

2 CSPRNG en PHP7

PHP 7 introduit deux nouvelles fonctions qui peuvent être utilisées pour implémenter CSPRNG : random_bytes et random_int. .

La fonction random_bytes renvoie une chaîne et accepte un paramètre d'entrée int représentant le nombre d'octets du résultat renvoyé.

Exemple :


$bytes = random_bytes('10');
var_dump(bin2hex($bytes));
//possible ouput: string(20) "7dfab0af960d359388e6"


La fonction random_int renvoie un nombre int dans la plage spécifiée.

Exemple :


var_dump(random_int(1, 100));
//possible output: 27


3. Environnement d'exploitation en arrière-plan

Le caractère aléatoire des fonctions ci-dessus varie en fonction de l'environnement :

  • Sous Windows, CryptGenRandom() est toujours utilisé.

  • Sur d'autres plateformes, arc4random_buf() sera utilisé s'il est disponible (établi sur les séries BSD ou les systèmes avec libbsd)

  • Si aucune des réponses ci-dessus n'est vraie, un appel système Linux getrandom(2) sera utilisé.

  • Sinon, /dev/urandom sera utilisé comme dernier outil disponible

  • Si aucune des solutions ci-dessus ne fonctionne, le système générera une erreur

Un simple test

Un bon système de génération de nombres aléatoires garantit une « qualité » de génération appropriée. Pour vérifier cette qualité, une série de tests statistiques sont généralement effectués. Sans aborder des sujets statistiques complexes, comparer un comportement connu aux résultats d'un générateur de nombres peut aider à évaluer la qualité.

Un test simple est le jeu de dés. Supposons que la probabilité de lancer 1 dé une fois pour obtenir un résultat de 6 est de 1/6, alors si je lance 3 dés en même temps 100 fois, le résultat sera à peu près le suivant :

0 6s = 57,9 fois
1 6 = 34,7 fois
2 6s = 6,9 fois
3 6s = 0,5 fois
Voici le code pour implémenter lancer les dés 1 000 000 de fois :


$times = 1000000;
$result = [];
for ($i=0; $i<$times; $i++){
  $dieRoll = array(6 => 0); //initializes just the six counting to zero
  $dieRoll[roll()] += 1; //first die
  $dieRoll[roll()] += 1; //second die
  $dieRoll[roll()] += 1; //third die
  $result[$dieRoll[6]] += 1; //counts the sixes
}
function roll(){
  return random_int(1,6);
}
var_dump($result);


En utilisant la fonction random_int et simple rand de PHP7, vous pouvez obtenir les résultats suivants

Si vous commencez par voir rand et random_int Pour une meilleure comparaison, nous pouvons appliquer une formule et tracer les résultats sur un graphique. La formule est : (résultat php-résultat attendu)/résultat attendu élevé à la puissance 0,5.

Le graphique des résultats est le suivant :

(les valeurs proches de 0 sont meilleures)

Bien que les résultats de 3 6 ne fonctionnent pas bien, et ce test est trop simple pour des applications pratiques. Nous pouvons quand même voir que random_int fonctionne mieux que rand.

De plus, le niveau de sécurité de notre application est dû à l'imprévisibilité et au comportement reproductible du. générateur de nombres aléatoires promouvoir.

Résumé  : Ce qui précède est l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'étude de chacun.

Recommandations associées :

Principe d'analyse de l'exemple de cycle d'exécution PHP

Explication détaillée de la structure du répertoire du code source PHP et de la description des fonctions

Tutoriel détaillé étape par étape pour l'installation modulaire de PHP


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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn