Polyfill PHP 5.x pour random_bytes()
et random_int()
créé et maintenu par Paragon Initiative Enterprises.
Bien que cette bibliothèque devrait fonctionner dans les versions antérieures de PHP, nous ne considérerons que les problèmes liés aux versions PHP prises en charge. Si vous utilisez une version de PHP non prise en charge, veuillez la mettre à jour dès que possible.
Bien que cette bibliothèque ait été examinée par certains experts en sécurité de la communauté PHP, il y aura toujours une chance que nous ayons oublié quelque chose. Veuillez demander à vos hackers de confiance préférés de le marteler pour détecter les erreurs et les bugs d'implémentation avant même de penser à le déployer en production.
N'utilisez pas la branche master, utilisez une version stable.
Pour connaître le contexte de cette bibliothèque, veuillez vous référer à notre article de blog sur la génération d'entiers et de chaînes aléatoires en PHP.
Si PHP ne peut pas générer de données aléatoires en toute sécurité, cette bibliothèque lancera une Exception
. Il ne reviendra jamais à des données aléatoires non sécurisées. Si cela continue, mettez immédiatement à niveau vers une version plus récente de PHP.
Avec le compositeur :
# For libraries and frameworks that support PHP 5 but may be used by # other software that only supports PHP 7: composer require paragonie/random_compat:>=2 # For software that explicitly needs PHP 5 support: composer require paragonie/random_compat:<9.99
Archives PHP signées :
Depuis la version 1.2.0, nous livrons également une archive PHP signée ECDSA avec chaque version stable sur Github.
Téléchargez les fichiers .phar
, .phar.pubkey
et .phar.pubkey.asc
.
( Recommandé mais pas obligatoire) Vérifiez la signature PGP de .phar.pubkey
(contenue dans le fichier .asc
) à l'aide de la clé publique PGP pour Paragon Initiative Enterprises.
Extrayez les fichiers .phar
et .phar.pubkey
dans le même répertoire.
require_once "/path/to/random_compat.phar";
Lorsqu'une nouvelle version est publiée, il vous suffit de remplacer le fichier .phar
; le .pubkey
ne changera pas (à moins que notre clé de signature ne soit compromise).
Installation manuelle :
Téléchargez une version stable.
Extrayez les fichiers dans votre projet.
require_once "/path/to/random_compat/lib/random.php";
Le point d'entrée doit être directement lib/random.php
, et non aucun des autres fichiers de /lib
.
Cette bibliothèque expose les fonctions CSPRNG ajoutées dans PHP 7 pour une utilisation dans les projets PHP 5. Leur comportement doit être identique.
essayez {$string = random_bytes(32); } catch (TypeError $e) {// Eh bien, c'est un entier, donc ceci EST inattendu.die("Une erreur inattendue s'est produite"); } catch (Error $e) {// Ceci est également inattendu car 32 est un entier raisonnable.die("Une erreur inattendue s'est produite"); } catch (Exception $e) {// Si vous recevez ce message, le CSPRNG a échoué hard.die("Impossible de générer une chaîne aléatoire. Notre système d'exploitation est-il sécurisé ?"); }var_dump(bin2hex($string));// string(64) "5787c41ae124b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2eeac6f"
essayez {$int = random_int(0, 255); } catch (TypeError $e) {// Eh bien, c'est un entier, donc ceci EST inattendu.die("Une erreur inattendue s'est produite"); } catch (Error $e) {// Ceci est également inattendu car 0 et 255 sont tous deux des entiers raisonnables.die("Une erreur inattendue s'est produite"); } catch (Exception $e) {// Si vous recevez ce message, le CSPRNG a échoué hard.die("Impossible de générer un int aléatoire. Notre système d'exploitation est-il sécurisé ?"); }var_dump($int);//int(47)
Lors de la gestion des exceptions et des erreurs, vous devez tenir compte des différences entre PHP 5 et PHP7.
Les différences :
Catching Error
fonctionne, à condition qu'il soit intercepté avant Exception
.
Catching Exception
a un comportement différent, sans avoir préalablement détecté Error
.
Il n’existe aucun moyen portable de détecter toutes les erreurs/exceptions.
Attrapez toujours Error
avant Exception
.
essayez {return random_int(1, $userInput); } catch (TypeError $e) {// Ce n'est pas grave, tant que `Error` est intercepté avant `Exception`.throw new Exception('Veuillez entrer un nombre !'); } catch (Error $e) {// Ceci est obligatoire, si vous n'avez rien à faire, rethrow.throw $e ; } catch (Exception $e) {// Ceci est facultatif et peut être omis si vous ne souhaitez pas gérer les erreurs // pendant la génération.throw new InternalServerErrorException ('Oups, notre serveur est en panne et ne peut générer aucune donnée aléatoire.',500 ,$e); }
Si une exception est levée, votre système d'exploitation n'est pas sécurisé.
Si vous êtes sous Windows, assurez-vous d'activer mcrypt.
Si vous utilisez un autre système d'exploitation, assurez-vous que /dev/urandom
est lisible.
Les prisons FreeBSD doivent exposer /dev/urandom
à partir du système d'exploitation hôte
Si vous utilisez open_basedir
, assurez-vous que /dev/urandom
est autorisé
Cette bibliothèque ne s'appuie pas (et n'acceptera aucun correctif) sur un générateur de nombres aléatoires non sécurisé.
Si vous utilisez un projet qui a une ligne comme celle-ci dans son composer.json
"require" { ... "paragonie/random_compat": "~1.1", ... }
... et puis vous essayez d'ajouter random_compat 2 (ou une autre bibliothèque qui nécessite explicitement random_compat 2, comme cette bibliothèque de cryptage PHP sécurisée), vous obtiendrez un conflit de version.
La solution consiste à amener le projet à mettre à jour sa chaîne d'exigences pour permettre l'utilisation de la version 2 et supérieure au lieu de verrouiller les utilisateurs en dur sur la version 1.
"exiger" { ...- "paragonie/random_compat": "~1.1",+ "paragonie/random_compat": ">=1",... }
Remarque : Il existe une version spéciale appelée 9.99.99
qui fait que cette bibliothèque ne fait rien, mais n'est installable que sur PHP 7.
Si vous écrivez un logiciel (par exemple une bibliothèque) qui prend en charge PHP 5, mais qui peut être utilisé par un logiciel qui ne le prend pas en charge, vous devrez autoriser l'installation 9.99.99
. La différence ci-dessus est ce que vous voulez.
À l'inverse, si vous écrivez un logiciel qui (en soi) prend en charge PHP 5, vous ne souhaitez pas que la version 9.99.99 soit installée, vous souhaiterez donc effectuer cette modification à la place :
"exiger" { ...- "paragonie/random_compat": "~1.1",+ "paragonie/random_compat": ">=1 <9.99",... }
Pour éviter d'installer la version 9.99.99
"vide", vous pouvez ajouter une section replace
dans votre racine composer.json
:
"replace": { "paragonie/random_compat": "9.99.99" },
Si vous utilisez l'approche PHP Archive (Phar) plutôt que Composer et que vous recevez un message d'erreur indiquant "la longueur de lecture du manifeste était {int1}
devrait être {int2}
", l'extension Phar n'est peut-être pas activée.
Consultez ce commentaire pour obtenir des conseils spécifiques sur la façon de résoudre ce problème.
Ce projet ne serait pas aussi excellent qu’il l’est aujourd’hui sans les contributions des personnes suivantes :
@AndrewCarterUK (Andrew Carter)
@asgrim (James Titcumb)
@bcremer (Benjamin Crémer)
@chriscct7 (Chris Christoff)
@CodesInChaos (Christian Winnerlein)
@ConnorVG (Connor S. Parcs)
@cs278 (Chris Smith)
@cweagans (Cameron Eagans)
@dd32 (Dion Hulse)
@geggleto (Glenn Eggleton)
@glensc (Elan Ruusamäe)
@GrahamCampbell (Graham Campbell)
@ircmaxell (Anthony Ferrara)
@jdevalk (Joost de Valk)
@jedisct1 (Frank Denis)
@juliangut (Julián Gutiérrez)
@kelunik (Niklas Keller)
@lt (Leigh)
@MasonM (Mason Malone)
@menkaff (Mehran NikNafs)
@mmeyer2k (Michael M)
@narfbg (Andreï Andreev)
@nicolas-grekas (Nicolas Grekas)
@ocean90 (Dominik Schilling)
@oittaa
@oucil (Kevin Farley)
@philios33 (Phil Nicholls)
@redragonx (Stephen Chávez)
@relaxnow (Garçon Baukema)
@rchouinard (Ryan Chouinard)
@rugk
@SammyK (Sammy Kaye Pouvoirs)
@scottchiefbaker (Scott Baker)
@skyosev (Stoyan Kyosev)
@sthen (Stuart Henderseon)
@stof (Christophe Coevoet)
@teohhanhui (Teoh Han Hui)
@tom-- (Tom Worster)
@tsyr2ko
@trowski (Aaron Piotrowski)
@twistor (Chris Lepannen)
@vinkla (Vincent Klaiber)
@voku (Lars Moelleken)
@xabbuh (Christian Flothmann)
Si votre entreprise utilise cette bibliothèque dans ses produits ou services, vous pourriez être intéressé par l'achat d'un contrat de support auprès de Paragon Initiative Enterprises.