Eu estou tentando gerar uma senha aleatória em php.
No entanto, estou recebendo todos os 'a's e o tipo de retorno é do tipo array e gostaria que fosse uma string. Alguma idéia de como corrigir o código?
Obrigado.
function randomPassword() {
$alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
for ($i = 0; $i < 8; $i++) {
$n = rand(0, count($alphabet)-1);
$pass[$i] = $alphabet[$n];
}
return $pass;
}
/dev/random
são suficientes, pois a pergunta não solicita uma senha " segura " (e não deve ser editada para conter isso, pois isso alteraria o significado da pergunta original). Embora eu seja a favor da segurança, acho que essa bomba de carpete não foi totalmente pensada. Como o usomysql_*
, as respostas ainda são válidas, mas devem ser marcadas como inseguras. Talvez isso seja algo que o SO precise incluir como software extra - a capacidade de avisar sobre códigos inseguros?Respostas:
Tente isso (use em
strlen
vez decount
, porquecount
em uma string é sempre1
):Demonstração: http://codepad.org/UL8k4aYK
fonte
$pass .= $alphabet[$n]
.mt_rand
é melhor também) #openssl_random_pseudo_bytes()
é usado em vez derand()
TL; DR:
random_int()
e os dadosrandom_str()
abaixo.random_int()
, use random_compat .Explicação:
Como você está gerando uma senha , é necessário garantir que a senha que você gera seja imprevisível, e a única maneira de garantir que essa propriedade esteja presente em sua implementação é usar um gerador de números pseudo-aleatórios criptograficamente seguros (CSPRNG).
O requisito para um CSPRNG pode ser relaxado para o caso geral de seqüências aleatórias, mas não quando a segurança está envolvida.
A resposta simples, segura e correta à geração de senhas no PHP é usar o RandomLib e não reinventar a roda. Essa biblioteca foi auditada por especialistas em segurança do setor e por mim.
Para desenvolvedores que preferem inventar sua própria solução, o PHP 7.0.0 fornecerá
random_int()
esse propósito. Se você ainda está no PHP 5.x, criamos um polyfill do PHP 5 pararandom_int()
que você possa usar a nova API antes do lançamento do PHP 7. Usar nossorandom_int()
polyfill é provavelmente mais seguro do que escrever sua própria implementação.Com um gerador inteiro aleatório seguro disponível, gerar uma sequência aleatória segura é mais fácil do que pie:
fonte
mcrypt_*
funções. Eu posso ver em um tópico de problema que você invadiu a biblioteca por não conseguir acessar o @ircmaxell, mas seu fork diz 'falha na compilação' em Travis. Gostaria de atualizar esta resposta (que ainda aparece bastante no Google)?Sei que você está tentando gerar sua senha de uma maneira específica, mas também pode querer usar esse método ...
Ele foi retirado do site php.net e cria uma string com o dobro do número que você coloca na função openssl_random_pseudo_bytes. Portanto, o acima criaria uma senha com 4 caracteres.
Em resumo...
Criaria uma senha com 8 caracteres.
Observe, no entanto, que a senha contém apenas os números 0-9 e letras minúsculas af!
fonte
openssl_random_pseudo_bytes()
é um poderoso gerador de aleatoriedade de bytes binários completos e não precisa de nenhuma alteração posterior. Também aproveitarei a oportunidade para ressaltar que é perigoso supor que o empilhamento de vários métodos de criptografia tornará qualquer coisa mais aleatória; em alguns casos, pode ser exatamente o oposto por causa da acumulação de colisões de hash.Código minúsculo com 2 linhas.
demo: http://codepad.org/5rHMHwnH
fonte
substr(str_shuffle(str_repeat($chars,$length)),0,$length);
Se você estiver no PHP7, poderá usar a
random_int()
função:fonte
mt_rand
para gerar uma senha.mt_rand
, portanto ainda é inadequada para qualquer uso de segurança.$chars
Em uma linha:
fonte
substr(str_shuffle(str_repeat($chars,$length)),0,$length);
Entropia restauradaSua melhor aposta é a biblioteca RandomLib da ircmaxell .
Exemplo de uso:
Produz seqüências que são mais fortemente aleatórias do que as funções normais de aleatoriedade, como (
shuffle()
erand()
é o que você geralmente deseja para informações confidenciais, como senhas, sais e chaves).fonte
rand()
oumt_rand()
.random_bytes
), mas isso não torna asrand
respostas incorretas.rand
não é uma boa escolha para senhasrand()
incorretamente. Eles estão incorretos por conta própria!Você quer
strlen($alphabet)
, nãocount
a constantealphabet
(equivalente a'alphabet'
).No entanto,
rand
não é uma função aleatória adequada para esse fim. Sua saída pode ser facilmente prevista, pois é implícita semeada com o tempo atual. Além disso,rand
não é criptograficamente seguro; portanto, é relativamente fácil determinar seu estado interno a partir da saída.Em vez disso, leia de
/dev/urandom
para obter dados criptograficamente aleatórios.fonte
Vou postar uma resposta porque algumas das respostas existentes são próximas, mas têm uma das seguintes:
Esta resposta contornará o
count/strlen
problema, pois a segurança da senha gerada, pelo menos IMHO, transcende como você está chegando lá. Também vou assumir o PHP> 5.3.0.Vamos dividir o problema nas partes constituintes que são:
Para a primeira parte, o PHP> 5.3.0 fornece a função
openssl_random_pseudo_bytes
. Observe que, embora a maioria dos sistemas use um algoritmo criptograficamente forte, você deve verificar se usaremos um wrapper:Para a segunda parte, usaremos
base64_encode
uma vez que é necessária uma sequência de bytes e produzirá uma série de caracteres que possuem um alfabeto muito próximo ao especificado na pergunta original. Se não nos importássemos em ter+
,/
e os=
caracteres aparecerem na sequência final e quisermos um resultado com pelo menos$n
caracteres, poderíamos simplesmente usar:O
3/4
fator se deve ao fato de a codificação base64 resultar em uma sequência que possui um comprimento pelo menos um terço maior que a sequência de bytes.$n
Caso contrário, o resultado será exato por ter múltiplos de 4 e até 3 caracteres. Como os caracteres extras são predominantemente o caractere de preenchimento=
, se, por algum motivo, tivermos uma restrição de que a senha tenha um tamanho exato, poderemos truncá-la para o tamanho desejado. Isso ocorre principalmente porque, para um determinado dado$n
, todas as senhas terminariam com o mesmo número delas, de modo que um invasor que tivesse acesso a uma senha de resultado teria até 2 caracteres a menos para adivinhar.Para crédito extra, se quiséssemos atender às especificações exatas, como na pergunta do OP, teríamos que trabalhar um pouco mais. Vou renunciar à abordagem de conversão de base aqui e seguir uma rápida e suja. Ambos precisam gerar mais aleatoriedade do que será usado no resultado de qualquer maneira, devido ao alfabeto de 62 entradas.
Para os caracteres extras no resultado, podemos simplesmente descartá-los da sequência resultante. Se começarmos com 8 bytes em nossa cadeia de bytes, até cerca de 25% dos caracteres base64 seriam esses caracteres "indesejáveis", de modo que simplesmente descartar esses caracteres resultará em uma cadeia não menor que o OP desejado. Em seguida, podemos simplesmente truncá-lo para obter o tamanho exato:
Se você gerar senhas mais longas, o caractere de preenchimento
=
formará uma proporção cada vez menor do resultado intermediário, para que você possa implementar uma abordagem mais enxuta, se for necessário drenar o pool de entropia usado para o PRNG.fonte
openssl_random_pseudo_bytes
poderia produzir um resultado fraco. Não sabia que era esse o caso.base_convert(uniqid('pass', true), 10, 36);
por exemplo.
e0m6ngefmj4
EDITAR
Como mencionei nos comentários, o tamanho significa que os ataques de força bruta funcionariam melhor contra eles do que os ataques de tempo, portanto, não é realmente relevante se preocupar com "quão seguro o gerador aleatório era". A segurança, especificamente para este caso de uso, precisa complementar a usabilidade, para que a solução acima seja realmente boa o suficiente para o problema necessário.
No entanto, no caso de você ter encontrado essa resposta enquanto procurava por um gerador de seqüências aleatórias seguras (como suponho que algumas pessoas tenham baseado nas respostas), por algo como gerar tokens, veja como um gerador desses códigos se pareceria:
fonte
Outro (somente linux)
fonte
fread()
armazena em buffer para 8192 bytes por padrão, para que você sempre leia muitos deles/dev/urandom
com o código fornecido. Isso também não funcionará no Windows. Kudos por usar um CSPRNG, no entanto.Sendo um pouco mais inteligente:
confira aqui .
fonte
Use este código simples para gerar uma senha de senha forte e mediana 12
fonte
Experimente com letras maiúsculas, minúsculas, caracteres numéricos e especiais
Exemplo (s) de saída:
, IZCQ_IV \ 7
@wlqsfhT (d
1! 8 + 1 \ 4 @ uD
fonte
rand
função não é realmente criptograficamente segura por isso pode ser um grande risco para gerar uma senha de usá-loRápido. Formato simples, limpo e consistente, se é isso que você deseja
fonte
Isso se baseia em outra resposta nesta página, https://stackoverflow.com/a/21498316/525649
Esta resposta gera apenas caracteres hexadecimais
0-9,a-f
,. Para algo que não se parece com hexadecimal, tente o seguinte:base64_encode
retorna uma propagação mais ampla de caracteres alfanuméricosrtrim
remove as=
vezes no finalExemplos:
32eFVfGDg891Be5e7293e54z1D23110M3ZU3FMjb30Z9a740Ej0jz4
b280R72b48eOm77a25YCj093DE5d9549Gc73Jg8TdD9Z0Nj4b98760
051b33654C0Eg201cfW0e6NA4b9614ze8D2FN49E12Y0zY557aUCb8
y67Q86ffd83G0z00M0Z152f7O2ADcY313gD7a774fc5FF069zdb5b7
Isso não é muito configurável para criar uma interface para os usuários, mas, para alguns propósitos, tudo bem. Aumente o número de caracteres para explicar a falta de caracteres especiais.
fonte
Chame como nos comentários.
fonte
Criei um script de senha mais abrangente e seguro. Isso criará uma combinação de dois caracteres maiúsculos, dois minúsculos, dois números e dois caracteres especiais. Total de 8 caracteres.
fonte
fonte
Gera uma senha forte de comprimento 8 que contém pelo menos uma letra minúscula, uma letra maiúscula, um dígito e um caractere especial. Você também pode alterar o tamanho do código.
fonte
Esta função irá gerar uma senha com base nas regras nos parâmetros
fonte
Aqui está minha opinião sobre o auxiliar de geração de senha simples e aleatória.
Ele garante que a senha tenha números, letras maiúsculas e minúsculas, além de no mínimo 3 caracteres especiais.
O comprimento da senha será entre 11 e 30.
fonte