Polyfill PHP 5.x para random_bytes()
e random_int()
criado e mantido pela Paragon Initiative Enterprises.
Embora esta biblioteca deva funcionar em versões anteriores do PHP, consideraremos apenas questões relevantes para versões suportadas do PHP. Se você estiver usando uma versão não suportada do PHP, atualize o mais rápido possível.
Embora esta biblioteca tenha sido examinada por alguns especialistas em segurança da comunidade PHP, sempre haverá uma chance de termos esquecido algo. Por favor, peça aos seus hackers de confiança favoritos para martelá-lo em busca de erros e bugs de implementação antes mesmo de pensar em implantá-lo na produção.
Não use o branch master, use uma versão estável.
Para obter mais informações sobre esta biblioteca, consulte nossa postagem no blog sobre Gerando números inteiros e strings aleatórios em PHP.
Se o PHP não puder gerar dados aleatórios com segurança, esta biblioteca lançará uma Exception
. Nunca recorrerá a dados aleatórios inseguros. Se isso continuar acontecendo, atualize para uma versão mais recente do PHP imediatamente.
Com 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
Arquivo PHP assinado:
A partir da versão 1.2.0, também enviamos um arquivo PHP assinado pela ECDSA com cada versão estável no Github.
Baixe os arquivos .phar
, .phar.pubkey
e .phar.pubkey.asc
.
( Recomendado , mas não obrigatório) Verifique a assinatura PGP de .phar.pubkey
(contida no arquivo .asc
) usando a chave pública PGP para Paragon Initiative Enterprises.
Extraia os arquivos .phar
e .phar.pubkey
para o mesmo diretório.
require_once "/path/to/random_compat.phar";
Quando uma nova versão é lançada, você só precisa substituir o arquivo .phar
; o .pubkey
não será alterado (a menos que nossa chave de assinatura seja comprometida).
Instalação manual:
Baixe uma versão estável.
Extraia os arquivos para o seu projeto.
require_once "/path/to/random_compat/lib/random.php";
O ponto de entrada deve ser lib/random.php
diretamente, e não qualquer outro arquivo em /lib
.
Esta biblioteca expõe as funções CSPRNG adicionadas no PHP 7 para uso em projetos PHP 5. O comportamento deles deve ser idêntico.
tente {$string = random_bytes(32); } catch (TypeError $e) {// Bem, é um número inteiro, então IS inesperado.die("Ocorreu um erro inesperado"); } catch (Error $e) {// Isso também é inesperado porque 32 é um número inteiro razoável.die("Ocorreu um erro inesperado"); } catch (Exception $e) {// Se você receber esta mensagem, o CSPRNG falhou hard.die("Não foi possível gerar uma string aleatória. Nosso sistema operacional é seguro?"); }var_dump(bin2hex($string));// string(64) "5787c41ae124b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2eeac6f"
tente {$int = random_int(0, 255); } catch (TypeError $e) {// Bem, é um número inteiro, então IS inesperado.die("Ocorreu um erro inesperado"); } catch (Error $e) {// Isso também é inesperado porque 0 e 255 são números inteiros razoáveis.die("Ocorreu um erro inesperado"); } catch (Exception $e) {// Se você receber esta mensagem, o CSPRNG falhou hard.die("Não foi possível gerar um int aleatório. Nosso sistema operacional é seguro?"); }var_dump($int);// int(47)
Ao lidar com exceções e erros você deve levar em conta as diferenças entre o PHP 5 e o PHP7.
As diferenças:
Catching Error
funciona, desde que seja capturado antes de Exception
.
Capturar Exception
tem comportamento diferente, sem capturar previamente Error
.
Não existe uma maneira portátil de capturar todos os erros/exceções.
Sempre capture Error
antes de Exception
.
tente {return random_int(1, $userInput); } catch (TypeError $e) {// Tudo bem, desde que `Error` seja capturado antes de `Exception`.throw new Exception('Por favor, insira um número!'); } catch (Error $e) {// Isso é obrigatório, se você não precisar fazer nada, apenas rethrow.throw $e; } catch (Exception $e) {// Isso é opcional e pode ser omitido se você não quiser lidar com erros // durante a geração.throw new InternalServerErrorException('Oops, nosso servidor está falido e não pode gerar nenhum dado aleatório.',500 ,$e); }
Se uma exceção for lançada, seu sistema operacional não será seguro.
Se você estiver no Windows, certifique-se de ativar o mcrypt.
Se você estiver em qualquer outro sistema operacional, certifique-se de que /dev/urandom
esteja legível.
As prisões do FreeBSD precisam expor /dev/urandom
do sistema operacional host
Se você usar open_basedir
, certifique-se de que /dev/urandom
seja permitido
Esta biblioteca não recorre (e não aceitará nenhum patch) para um gerador de números aleatórios inseguro.
Se você estiver usando um projeto que possui uma linha como esta em seu compositor.json
"require" { ... "paragonie/random_compat": "~1.1", ... }
... e então você tentar adicionar random_compat 2 (ou outra biblioteca que exija explicitamente random_compat 2, como esta biblioteca segura de criptografia PHP), você obterá um conflito de versão.
A solução é fazer com que o projeto atualize sua string de requisitos para permitir que a versão 2 e superior seja usada em vez de bloquear usuários para a versão 1.
"exigir" { ...- "paragonie/random_compat": "~1.1",+ "paragonie/random_compat": ">=1",... }
Nota : Existe uma versão especial chamada 9.99.99
que faz com que esta biblioteca não faça nada, mas só pode ser instalada no PHP 7.
Se você estiver escrevendo um software (por exemplo, uma biblioteca) que suporta PHP 5, mas pode ser usado por software que não o suporta, você desejará permitir a instalação 9.99.99
. A diferença acima é o que você deseja.
Por outro lado, se você estiver escrevendo um software que (por si só) suporta PHP 5, você não deseja que o 9.99.99 seja instalado, então você desejará fazer esta alteração:
"exigir" { ...- "paragonie/random_compat": "~1.1",+ "paragonie/random_compat": ">=1 <9.99",... }
Para evitar a instalação da versão "vazia" 9.99.99
você pode adicionar a seção replace
em sua raiz composer.json
:
"replace": { "paragonie/random_compat": "9.99.99" },
Se você estiver usando a abordagem PHP Archive (Phar) em vez do Composer, e estiver recebendo uma mensagem de erro no sentido de "o comprimento da leitura do manifesto era {int1}
deveria ser {int2}
", a extensão Phar pode não estar habilitada.
Consulte este comentário para obter orientações específicas sobre como corrigir esse problema.
Este projeto não seria tão excelente como é hoje se não fosse pelas contribuições das seguintes pessoas:
@AndrewCarterUK (Andrew Carter)
@asgrim (James Titcumb)
@bcremer (Benjamin 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 (Andrei Andreev)
@nicolas-grekas (Nicolas Grekas)
@ocean90 (Dominik Schilling)
@oittaa
@oucil (Kevin Farley)
@philios33 (Phil Nicholls)
@redragonx (Stephen Chávez)
@relaxnow (Garoto Baukema)
@rchouinard (Ryan Chouinard)
@rugk
@SammyK (Poderes de Sammy Kaye)
@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)
Se sua empresa usa esta biblioteca em seus produtos ou serviços, você pode estar interessado em adquirir um contrato de suporte da Paragon Initiative Enterprises.