Estou tentando criar uma string aleatória no PHP e não recebo absolutamente nenhuma saída com isso:
<?php
function RandomString()
{
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randstring = '';
for ($i = 0; $i < 10; $i++) {
$randstring = $characters[rand(0, strlen($characters))];
}
return $randstring;
}
RandomString();
echo $randstring;
O que estou fazendo errado?
strlen($characters)
=>strlen($characters) - 1
- o comprimento da string começa com 1Respostas:
Para responder especificamente a essa pergunta, dois problemas:
$randstring
não está no escopo quando você faz o eco.Aqui está um trecho de código com as correções:
Emita a sequência aleatória com a chamada abaixo:
fonte
substr(str_shuffle(MD5(microtime())), 0, 10);
?rand()
paramt_rand()
. Eu usei seu método e experimentei uma tonelada de colisões com nomes.Mais uma maneira.
ATUALIZADO (agora isso gera qualquer comprimento de string):
É isso aí. :)
fonte
Há muitas respostas para essa pergunta, mas nenhuma delas utiliza um gerador de números pseudo-aleatórios criptograficamente seguros (CSPRNG).
A resposta simples, segura e correta é usar o RandomLib e não reinventar a roda.
Para aqueles que insistem em inventar sua própria solução, o PHP 7.0.0 fornecerá
random_int()
esse propósito; se você ainda usa o PHP 5.x, criamos um polyfill do PHP 5 pararandom_int()
que você possa usar a nova API antes de atualizar para o PHP 7.Gerar números inteiros aleatórios com segurança no PHP não é uma tarefa trivial. Você deve sempre verificar com os especialistas em criptografia StackExchange residentes antes de implantar um algoritmo caseiro na produção.
Com um gerador inteiro seguro no lugar, gerar uma sequência aleatória com um CSPRNG é uma caminhada no parque.
Criando uma seqüência aleatória segura
Uso :
Demo : https://3v4l.org/IMJGF (Ignore as falhas do PHP 5; ele precisa de random_compat)
fonte
$keyspace = str_shuffle($keyspace );
mais segurançarandom_int()
vez derand()
oumt_rand()
não adiciona complexidade ao desenvolvedor. Ao mesmo tempo, oferece maior segurança. As pessoas que vêm ao StackOverflow procurando soluções rápidas podem não saber se o que estão construindo precisa ser seguro ou não. Se lhes dermos respostas seguras por padrão, elas criarão uma Internet mais segura, mesmo que, de sua perspectiva, seja totalmente acidental. Por que você se oporia a esse objetivo é um mistério para mim.Isso cria uma cadeia hexadecimal de 20 caracteres:
No PHP 7 ( random_bytes () ):
fonte
openssl_random_pseudo_bytes()
não utilizou um algoritmo criptograficamente forte até o php 5.6. Erro relacionado: bugs.php.net/bug.php?id=70014openssl_random_pseudo_bytes()
você, não receberá nada de volta. Além disso, observe que ao usarbin2hex(openssl_random_pseudo_bytes($length / 2))
desde que você está trabalhando com números inteiros, ele removerá automaticamente o módulo e usará o próximo múltiplo mais baixo de 2. Portanto,$length = 19
produzirá uma sequência de comprimento 18.fgets($fp, 1024)
todos os editores de arquivos com problemas com linhas muito longas:function string_rand($len, $split="\n") { return substr(chunk_split(bin2hex(openssl_random_pseudo_bytes(ceil($len / 2))), 1023, $split), 0, $len); }
defina$split
comonull
se deve retornar uma linha única. Com isso, você pode usá-lo nos dois casos.$string = substr(base64_encode(random_bytes($size)), 0, $size);
@tasmaniski: sua resposta funcionou para mim. Eu tive o mesmo problema, e eu o sugeriria para quem está sempre procurando a mesma resposta. Aqui é de @tasmaniski:
Aqui está um vídeo do youtube mostrando como criar um número aleatório
fonte
md5
que resultará em um limite de 30 caracteres e sempre em minúsculas.md5(rand())
oferece apenas 2 ^ 32 valores possíveis. Isso significa que, após, em média, 2 ^ 16 seqüências aleatórias, espera-se que você repita.Dependendo da sua aplicação (eu queria gerar senhas), você poderia usar
Sendo base64, eles podem conter
=
ou-
os caracteres solicitados. Você pode gerar uma sequência mais longa, filtrar e aparar para removê-las.openssl_random_pseudo_bytes
parece ser a maneira recomendada de gerar um número aleatório adequado em php. Porrand
que não usa/dev/random
eu não sei.fonte
openssl_random_pseudo_bytes()
é portátil.Aqui está uma linha única simples que gera uma verdadeira sequência aleatória sem nenhum loop de nível de script ou uso de bibliotecas OpenSSL.
Para dividi-lo para que os parâmetros sejam claros
Esse método funciona repetindo aleatoriamente a lista de caracteres, embaralha a seqüência combinada e retorna o número de caracteres especificado.
Você pode randomizar isso ainda mais, randomizando o comprimento da sequência retornada, substituindo
$chrRandomLength
pormt_rand(8, 15)
(para uma sequência aleatória entre 8 e 15 caracteres).fonte
$chrRepeatMax
e$chrRepeatMin
) - portanto, uma string de 10 caracteres poderia (improvável, mas possível) ser "aaaaaaaaaa".Tada!
fonte
sha1
que o limite de 40 caracteres será sempre minúsculo.rant()
ser aleatório não importa quando sha não é distribuído uniformemente. Se você selecionar aleatoriamente a partir de uma distribuição desigual, obterá exatamente a mesma distribuição desigual. Não estou destacando a aleatoriedade no "nível de criptografia", se esse também não era o casorand()
. É preciso um esforço mínimo para obter uma distribuição uniforme, como na resposta aceita, e é tão aleatório quanto rand () razoavelmente.Uma maneira melhor de implementar essa função é:
mt_rand
é mais aleatório de acordo com isso e isso no PHP 7. Arand
função é um alias demt_rand
.fonte
mt_rand
não gera valores criptograficamente seguros. Para isso, você deve usar PHP7random_int
ourandom_bytes
.$randstring
no escopo da função não é igual ao escopo em que você o chama. Você precisa atribuir o valor de retorno a uma variável.Ou apenas faça eco diretamente no valor de retorno:
Além disso, em sua função, você tem um pequeno erro. Dentro do loop for, você precisa usar
.=
para que cada caractere seja anexado à string. Ao usá-=
lo, você o substituirá com cada novo caractere, em vez de anexá-lo.fonte
Primeiro, você define o alfabeto que deseja usar:
Em seguida, use
openssl_random_pseudo_bytes()
para gerar dados aleatórios adequados:Por fim, você usa esses dados aleatórios para criar a senha. Como cada caractere
$random
pode durarchr(0)
atéchr(255)
, o código usa o restante após a divisão de seu valor ordinal com$alphabet_length
para garantir que apenas os caracteres do alfabeto sejam escolhidos (observe que isso influencia a aleatoriedade):Como alternativa, e geralmente melhor, é usar RandomLib e SecurityLib :
fonte
%
produzirá saída tendenciosa. No entanto, +1 forte para RandomLib. Não reinvente a roda.Métodos curtos ..
Aqui estão alguns métodos mais curtos para gerar a string aleatória
fonte
Eu testei o desempenho das funções mais populares lá, o tempo necessário para gerar 1'000'000 strings de 32 símbolos na minha caixa é:
Observe que não é importante quanto tempo realmente durou, mas qual é mais lento e qual é mais rápido, para que você possa selecionar de acordo com seus requisitos, incluindo prontidão para criptografia etc.
substr () ao redor do MD5 foi adicionado para garantir a precisão, se você precisar de uma string menor que 32 símbolos.
Por uma questão de resposta: a sequência não foi concatenada, mas substituída e o resultado da função não foi armazenado.
fonte
PHP 7+ Gere bytes aleatórios criptograficamente seguros usando a função random_bytes .
Saída possível
PHP 5.3+ Gere bytes pseudo-aleatórios usando a função openssl_random_pseudo_bytes .
Saída possível
O melhor caso de uso pode ser
Saída possível
fonte
Uma maneira muito rápida é fazer algo como:
Isso irá gerar uma sequência aleatória com o comprimento de 10 caracteres. Certamente, alguns podem dizer que é um pouco mais pesado no lado da computação, mas hoje em dia os processadores são otimizados para executar o algoritmo md5 ou sha256 muito rapidamente. E, é claro, se a
rand()
função retornar o mesmo valor, o resultado será o mesmo, com uma chance de 1/32767 de ser o mesmo. Se a segurança é o problema, basta alterarrand()
paramt_rand()
fonte
fonte
Este foi retirado de fontes de administrador :
Adminer , ferramenta de gerenciamento de banco de dados escrita em PHP.
fonte
Função auxiliar do framework Laravel 5
fonte
Fonte: http://www.xeweb.net/2011/02/11/generate-a-random-string-az-0-9-in-php/
fonte
A versão editada da função funciona bem, mas encontrei apenas um problema: você usou o caractere errado para incluir $ caracteres; portanto, o caractere 'às vezes faz parte da sequência aleatória gerada.
Para corrigir isso, altere:
para:
Dessa forma, apenas os caracteres incluídos são usados e o caractere 'nunca fará parte da sequência aleatória gerada.
fonte
Outra linha, que gera uma sequência aleatória de 10 caracteres com letras e números. Ele criará uma matriz com
range
(ajuste o segundo parâmetro para definir o tamanho), passa por essa matriz e atribui um caractere ASCII aleatório (intervalo de 0 a 9 ou az) e depois implode a matriz para obter uma sequência.Nota: isso funciona apenas no PHP 5.3 e posterior
fonte
rand(0, 57-48+122-97)<57-48?...:...
? :)Um forro.
É rápido para cordas enormes com alguma exclusividade.
fonte
md5(rand())
é uma maneira terrivelmente insegura de gerar um número aleatório.Desde php7, existem as funções random_bytes. https://www.php.net/manual/ru/function.random-bytes.php Para gerar uma sequência aleatória como essa
fonte
Gostei do último comentário que usou o openssl_random_pseudo_bytes, mas não foi uma solução para mim, pois ainda tinha que remover os caracteres que não queria e não consegui obter uma string de comprimento definido. Aqui está a minha solução ...
fonte
fonte
Aqui está minha solução simples de uma linha para gerar uma senha aleatória amigável para o uso, excluindo caracteres semelhantes a "1" e "l", "O" e "0", etc ... aqui estão 5 caracteres, mas você pode facilmente mude de curso:
fonte
Aqui está outra solução.
PS. Estou usando o PHP 7.2 no Ubuntu.
fonte
Outra maneira de gerar uma string aleatória no PHP é:
fonte
Aqui está como eu estou fazendo isso para obter uma chave aleatória única e verdadeira:
Você pode usar time (), pois é um carimbo de data / hora do Unix e sempre é único em comparação com outros aleatórios mencionados acima. Em seguida, você pode gerar o md5sum e obter o comprimento desejado da cadeia MD5 gerada . Nesse caso, estou usando 10 caracteres e poderia usar uma string mais longa se quiser torná-la mais exclusiva.
Eu espero que isso ajude.
fonte
time()
está longe de ser único: ele retornará o mesmo valor repetidamente até o final do segundo atual. O que realmente fornece alguma aleatoriedade aqui é: ostr_shuffle()
restante do código reduz apenas a amostra para a seleção de caracteres.time()
(é apenas um carimbo de data / hora), é uma fonte fraca de aleatoriedade.One-liner parametrizado usando apenas funções nativas do PHP , trabalhando desde o PHP 5.1.0
fonte