PHP 5.x polyfill para random_bytes() y random_int() creado y mantenido por Paragon Initiative Enterprises.
Aunque esta biblioteca debería funcionar en versiones anteriores de PHP, solo consideraremos cuestiones relevantes para las versiones de PHP compatibles. Si está utilizando una versión no compatible de PHP, actualícela lo antes posible.
Aunque esta biblioteca ha sido examinada por algunos expertos en seguridad de la comunidad PHP, siempre existirá la posibilidad de que hayamos pasado por alto algo. Pídale a sus piratas informáticos de confianza favoritos que lo revisen para detectar errores y errores de implementación antes de siquiera pensar en implementarlo en producción.
No utilice la rama maestra, utilice una versión estable.
Para conocer los antecedentes de esta biblioteca, consulte nuestra publicación de blog sobre Generación de cadenas y enteros aleatorios en PHP.
Si PHP no puede generar datos aleatorios de forma segura, esta biblioteca generará una Exception . Nunca recurrirá a datos aleatorios inseguros. Si esto continúa sucediendo, actualice inmediatamente a una versión más nueva de PHP.
Con el compositor:
# 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
Archivo PHP firmado:
A partir de la versión 1.2.0, también enviamos un archivo PHP firmado por ECDSA con cada versión estable en Github.
Descargue los archivos .phar , .phar.pubkey y .phar.pubkey.asc .
( Recomendado pero no obligatorio) Verifique la firma PGP de .phar.pubkey (contenida en el archivo .asc ) utilizando la clave pública PGP de Paragon Initiative Enterprises.
Extraiga los archivos .phar y .phar.pubkey al mismo directorio.
require_once "/path/to/random_compat.phar";
Cuando se lanza una nueva versión, sólo necesita reemplazar el archivo .phar ; el .pubkey no cambiará (a menos que nuestra clave de firma se vea comprometida).
Instalación manual:
Descargue una versión estable.
Extraiga los archivos a su proyecto.
require_once "/path/to/random_compat/lib/random.php";
El punto de entrada debe ser lib/random.php directamente, no ninguno de los otros archivos en /lib .
Esta biblioteca expone las funciones CSPRNG agregadas en PHP 7 para usar en proyectos PHP 5. Su comportamiento debería ser idéntico.
prueba {$string = random_bytes(32);
} catch (TypeError $e) {// Bueno, es un número entero, por lo que ES inesperado.die("Se ha producido un error inesperado");
} catch (Error $e) {// Esto también es inesperado porque 32 es un entero razonable.die("Se ha producido un error inesperado");
} catch (Exception $e) {// Si recibe este mensaje, el CSPRNG falló hard.die("No se pudo generar una cadena aleatoria. ¿Es seguro nuestro sistema operativo?");
}var_dump(bin2hex($string));// string(64) "5787c41ae124b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2eeac6f" prueba {$int = random_int(0, 255);
} catch (TypeError $e) {// Bueno, es un número entero, por lo que ES inesperado.die("Se ha producido un error inesperado");
} catch (Error $e) {// Esto también es inesperado porque 0 y 255 son enteros razonables.die("Se ha producido un error inesperado");
} catch (Exception $e) {// Si recibe este mensaje, el CSPRNG falló hard.die("No se pudo generar un int aleatorio. ¿Es seguro nuestro sistema operativo?");
}var_dump($int);//int(47)Al manejar excepciones y errores, debe tener en cuenta las diferencias entre PHP 5 y PHP7.
Las diferencias:
La captura de Error funciona, siempre que se detecte antes de Exception .
La captura Exception tiene un comportamiento diferente, sin detectar previamente Error .
No existe una forma portátil de detectar todos los errores/excepciones.
Siempre detecte Error antes que Exception .
prueba {return random_int(1, $userInput);
} catch (TypeError $e) {// Esto está bien, siempre y cuando `Error` se detecte antes de `Exception`.throw new Exception('¡Ingrese un número!');
} catch (Error $e) {// Esto es obligatorio, si no necesita hacer nada, simplemente rethrow.throw $e;
} catch (Exception $e) {// Esto es opcional y puede omitirse si no desea manejar errores // durante la generación.throw new InternalServerErrorException('Ups, nuestro servidor está roto y no puede generar ningún dato aleatorio.',500 ,$e);
}Si se produce una excepción, entonces su sistema operativo no es seguro.
Si estás en Windows, asegúrate de habilitar mcrypt.
Si está en cualquier otro sistema operativo, asegúrese de que /dev/urandom sea legible.
Las cárceles de FreeBSD necesitan exponer /dev/urandom desde el sistema operativo host
Si usa open_basedir , asegúrese de que /dev/urandom esté permitido
Esta biblioteca no recurre (y no aceptará ningún parche) a un generador de números aleatorios inseguro.
Si estás usando un proyecto que tiene una línea como esta en su archivo compositor.json
"require" {
...
"paragonie/random_compat": "~1.1",
...
}...y luego intenta agregar random_compat 2 (u otra biblioteca que requiera explícitamente random_compat 2, como esta biblioteca de cifrado PHP segura), obtendrá un conflicto de versiones.
La solución es hacer que el proyecto actualice su cadena de requisitos para permitir el uso de la versión 2 y superiores en lugar de bloquear a los usuarios a la versión 1.
"requerir" {
...- "paragonie/random_compat": "~1.1",+ "paragonie/random_compat": ">=1",...
} Nota : Existe una versión especial llamada 9.99.99 que hace que esta biblioteca no haga nada, pero solo se puede instalar en PHP 7.
Si está escribiendo software (por ejemplo, una biblioteca) que admite PHP 5, pero puede ser utilizado por software que no lo hace, querrá permitir que se instale 9.99.99 . La diferencia anterior es lo que quieres.
Por el contrario, si estás escribiendo software que (en sí mismo) soporta PHP 5, no quieres que se instale 9.99.99, por lo que querrás hacer este cambio en su lugar:
"requerir" {
...- "paragonie/random_compat": "~1.1",+ "paragonie/random_compat": ">=1 <9.99",...
} Para evitar instalar la versión "vacía" 9.99.99 puede agregar la sección replace en su composer.json :
"replace": {
"paragonie/random_compat": "9.99.99"
}, Si está utilizando el enfoque PHP Archive (Phar) en lugar de Composer, y recibe un mensaje de error en el sentido de "la longitud de lectura del manifiesto fue {int1} debería ser {int2} ", es posible que la extensión Phar no esté habilitada.
Consulte este comentario para obtener orientación específica sobre cómo solucionar este problema.
Este proyecto no sería tan excelente como lo es hoy si no fuera por las contribuciones de las siguientes personas:
@AndrewCarterUK (Andrew Carter)
@asgrim (James Titcumb)
@bcremer (Benjamín Cremer)
@chriscct7 (Chris Christoff)
@CodesInChaos (Christian Winnerlein)
@ConnorVG (Connor S.Parques)
@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 (Andrey Andreev)
@nicolas-grekas (Nicolás Grekas)
@ocean90 (Dominik Schilling)
@oittaa
@oucil (Kevin Farley)
@philios33 (Phil Nicholls)
@redragonx (Stephen Chávez)
@relaxnow (Niño Baukema)
@rchouinard (Ryan Chouinard)
@rugk
@SammyK (Poderes de Sammy Kaye)
@scottchiefbaker (Scott Baker)
@skyosev (Stoyan Kyosev)
@sthen (Stuart Henderson)
@stof (Christophe Coevoët)
@teohhanhui (Teoh Han Hui)
@tom-- (Tom Worster)
@tsyr2ko
@trowski (Aarón Piotrowski)
@twistor (Chris Lepannen)
@vinkla (Vincent Klaiber)
@voku (Lars Moelleken)
@xabbuh (Christian Flothmann)
Si su empresa utiliza esta biblioteca en sus productos o servicios, es posible que le interese adquirir un contrato de soporte de Paragon Initiative Enterprises.