Como seria possível gerar uma sequência aleatória e exclusiva usando números e letras para uso em um link de verificação? Como quando você cria uma conta em um site, e ele envia um e-mail com um link, e você precisa clicar nesse link para verificar sua conta ... sim ... uma delas.
Como posso gerar um usando PHP?
Atualização: Acabei de me lembrar uniqid()
. É uma função PHP que gera um identificador exclusivo com base no tempo atual em microssegundos. Eu acho que vou usar isso.
php
string
random
uniqueidentifier
Andrew
fonte
fonte
Scott
como a resposta correta. Scott está usando o gerador de números psudo-aleatórios criptograficamente seguros (CSPRNG) do OpenSSL, que escolherá a fonte mais segura de entropia com base em sua plataforma.uniqid
são inseguros. Use algo comoRandom::alphanumericString($length)
ouRandom::alphanumericHumanString($length)
.Respostas:
Se você não precisar que seja absolutamente único ao longo do tempo:
md5(uniqid(rand(), true))
Caso contrário (dado que você já determinou um login exclusivo para seu usuário):
fonte
Eu estava pensando em como resolver esse mesmo problema, mas também quero que minha função crie um token que também possa ser usado para recuperação de senha. Isso significa que eu preciso limitar a capacidade do token de ser adivinhado. Como
uniqid
é baseado no tempo, e de acordo com o php.net "o valor de retorno é um pouco diferente de microtime ()",uniqid
não atende aos critérios. O PHP recomenda o usoopenssl_random_pseudo_bytes()
para gerar tokens criptograficamente seguros.Uma resposta rápida, curta e direta é:
que gerará uma sequência aleatória de caracteres alfanuméricos de comprimento = $ bytes * 2. Infelizmente, isso só tem um alfabeto de
[a-f][0-9]
, mas funciona.Abaixo está a função mais forte que eu poderia desempenhar que satisfaz os critérios (esta é uma versão implementada da resposta de Erik).
crypto_rand_secure($min, $max)
funciona como uma gota em substituição arand()
oumt_rand
. Ele usa openssl_random_pseudo_bytes para ajudar a criar um número aleatório entre $ min e $ max.getToken($length)
cria um alfabeto para usar no token e, em seguida, cria uma sequência de comprimento$length
.EDIT: Eu esqueci de citar a fonte - http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322
EDIT (PHP7): Com o lançamento do PHP7, a biblioteca padrão agora possui duas novas funções que podem substituir / melhorar / simplificar a função crypto_rand_secure acima.
random_bytes($length)
erandom_int($min, $max)
http://php.net/manual/en/function.random-bytes.php
http://php.net/manual/en/function.random-int.php
Exemplo:
fonte
base64_encode
vez debin2hex
obter uma sequência mais curta com alfabeto maior.Versão orientada a objeto da solução mais votada
Eu criei uma solução orientada a objetos com base na resposta de Scott :
Uso
Alfabeto personalizado
Você pode usar o alfabeto personalizado, se necessário. Basta passar uma string com caracteres suportados para o construtor ou setter:
Aqui estão as amostras de saída
Espero que ajude alguém. Felicidades!
fonte
$obj = new RandomStringGenerator;
mas qual método devo chamar? Obrigado.generate
método como no exemplo acima. Basta passar um número inteiro para ele para especificar o comprimento da string resultante.Custom Alphabet
não funcionou. Recebi uma saída vazia quando ecoei. Enfim, eu nem tenho certeza do que é o segundo exemplo,Custom Alphabet
então acho que fico com o primeiro exemplo. Obrigado.Estou atrasado, mas estou aqui com alguns bons dados de pesquisa com base nas funções fornecidas pela resposta de Scott . Então, configurei uma gota do Digital Ocean apenas para esse teste automatizado de cinco dias e armazenei as seqüências exclusivas geradas em um banco de dados MySQL.
Durante esse período de teste, usei 5 comprimentos diferentes (5, 10, 15, 20, 50) e +/- 0,5 milhão de registros foram inseridos para cada comprimento. Durante o meu teste, apenas o comprimento 5 gerou +/- 3K duplicatas em 0,5 milhão e os comprimentos restantes não geraram duplicatas. Portanto, podemos dizer que, se usarmos um comprimento de 15 ou mais com as funções de Scott, poderemos gerar seqüências únicas altamente confiáveis. Aqui está a tabela que mostra meus dados de pesquisa:
Atualização: criei um aplicativo Heroku simples usando essas funções que retornam o token como uma resposta JSON. O aplicativo pode ser acessado em https://uniquestrings.herokuapp.com/api/token?length=15
Eu espero que isso ajude.
fonte
Você pode usar o UUID (Universally Unique Identifier), ele pode ser usado para qualquer finalidade, desde a sequência de autenticação do usuário até a identificação da transação de pagamento.
Um UUID é um número de 16 octetos (128 bits). Em sua forma canônica, um UUID é representado por 32 dígitos hexadecimais, exibidos em cinco grupos separados por hífens, no formato 8-4-4-4-12, para um total de 36 caracteres (32 caracteres alfanuméricos e quatro hífens).
// chamando função
alguns exemplos de saídas serão como:
espero que ajude alguém no futuro :)
fonte
Esta função irá gerar uma chave aleatória usando números e letras:
Exemplo de saída:
fonte
Eu uso este one-liner:
onde length é o comprimento da string desejada (divisível por 4, caso contrário, ela é arredondada para o número mais próximo divisível por 4)
fonte
==
base64url_encode
pode ser usado em vez disso, veja aqui: php.net/manual/en/function.base64-encode.phpUse o código abaixo para gerar o número aleatório de 11 caracteres ou altere o número conforme sua exigência.
ou podemos usar a função personalizada para gerar o número aleatório
fonte
substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstvwxyz', 36)), 0, 11);
por exemplo (em pseudo código)
fonte
Aqui está o melhor gerador de identificação exclusivo para você. feito por mim.
você pode repetir qualquer 'var' do seu ID como desejar. mas $ mdun é melhor, você pode substituir md5 por sha1 para obter um código melhor, mas isso será muito longo, o que talvez você não precise.
Obrigado.
fonte
Para seqüências realmente aleatórias, você pode usar
saídas:
portanto, mesmo se você tentar gerar string várias vezes ao mesmo tempo, terá uma saída diferente.
fonte
Ao tentar gerar uma senha aleatória, você está tentando:
Primeiro gere um conjunto criptograficamente seguro de bytes aleatórios
O segundo é transformar esses bytes aleatórios em uma sequência imprimível
Agora, existem várias maneiras de gerar bytes aleatórios em php como:
Então você deseja transformar esses bytes aleatórios em uma sequência imprimível:
Você pode usar bin2hex :
ou base64_encode :
No entanto, observe que você não controla o comprimento da sequência se usar o base64. Você pode usar bin2hex para fazer isso, usando 32 bytes se transformará em uma seqüência de caracteres de 64 caracteres . Mas isso só funcionará dessa maneira em uma string EVEN .
Então, basicamente, você pode fazer :
fonte
Aqui está o que eu uso:
fonte
fonte
Essa é uma função simples que permite gerar seqüências aleatórias contendo letras e números (alfanuméricos). Você também pode limitar o comprimento da string. Essas seqüências aleatórias podem ser usadas para vários propósitos, incluindo: Código de referência, Código promocional, Código de cupom. A função depende das seguintes funções do PHP: base_convert, sha1, uniqid, mt_rand
fonte
depois de ler os exemplos anteriores, vim com isso:
Duplico 10 vezes a matriz [0-9, AZ] e embaralha os elementos, depois de obter um ponto de início aleatório para substr () ser mais 'criativo' :) você pode adicionar [az] e outros elementos à matriz, duplicar mais ou menos, seja mais criativo que eu
fonte
Eu gosto de usar chaves de hash ao lidar com links de verificação. Eu recomendaria usar o microtime e o hash que usem o MD5, pois não deve haver razão para que as chaves sejam as mesmas, pois o hash baseia-se no microtime.
$key = md5(rand());
$key = md5(microtime());
fonte
A função acima irá gerar uma sequência aleatória com 11 caracteres.
fonte
Se você deseja gerar uma string única no PHP, tente seguir.
Nisso,
uniqid()
- Ele irá gerar uma string única. Essa função retorna o identificador exclusivo baseado em carimbo de data e hora como uma sequência.mt_rand()
- Gere número aleatório.md5()
- Ele irá gerar a cadeia de hash.fonte
Scott, sim, você é muito escritor e boa solução! Obrigado.
Também sou obrigado a gerar um token de API exclusivo para cada usuário. A seguir, minha abordagem, usei informações do usuário (ID do usuário e nome de usuário):
Por favor, dê uma olhada e deixe-me saber se alguma melhoria eu posso fazer. obrigado
fonte
Aqui está o que estou usando em um dos meus projetos: ele está funcionando muito bem e gera um token aleatório exclusivo :
Observe que eu multipliquei o carimbo de data / hora por três para criar uma confusão para quem quer que o usuário esteja se perguntando como esse token é gerado;)
Espero que ajude :)
fonte
Eu acho que esse é o melhor método para usar.
fonte
podemos usar essas duas linhas de código para gerar uma string única, testamos cerca de 10000000 vezes de iteração
fonte
Eu sempre uso essa minha função para gerar uma seqüência alfanumérica aleatória personalizada ... Espero que ajude.
Ele gera, por exemplo: Y1FypdjVbFCFK6Gh9FDJpe6dciwJEfV6MQGpJqAfuijaYSZ86g
Se você deseja comparar com outra string para ter certeza de que é uma sequência única, use este truque ...
gera duas seqüências únicas:
qsBDs4JOoVRfFxyLAOGECYIsWvpcpMzAO9pypwxsqPKeAmYLOi
Ti3kE1WfGgTNxQVXtbNNbhhvvapnaUfGMVJecHkUjHbuCb85pF
Espero que seja isso que você está procurando...
fonte
Uma solução simples é converter a base 64 em alfanumérica, descartando os caracteres não alfanuméricos.
Este usa random_bytes () para um resultado criptograficamente seguro.
fonte
Eu acho que essa é a melhor solução
fonte
Acredito que o problema com todas as idéias existentes é que elas provavelmente são únicas, mas não definitivamente únicas (como apontado na resposta de Dariusz Walczak ao loletech). Eu tenho uma solução que é realmente única. Requer que seu script tenha algum tipo de memória. Para mim, este é um banco de dados SQL. Você também pode simplesmente gravar em um arquivo em algum lugar. Existem duas implementações:
Primeiro método: tenha DOIS campos em vez de 1 que fornecem exclusividade. O primeiro campo é um número de ID que não é aleatório, mas é único (o primeiro ID é 1, o segundo 2 ...). Se você estiver usando SQL, basta definir o campo ID com a propriedade AUTO_INCREMENT. O segundo campo não é exclusivo, mas é aleatório. Isso pode ser gerado com qualquer uma das outras técnicas que as pessoas já mencionaram. A ideia de Scott foi boa, mas o md5 é conveniente e provavelmente bom o suficiente para a maioria dos propósitos:
Segundo método: Basicamente, a mesma ideia, mas escolha inicialmente um número máximo de strings que serão geradas. Este poderia ser um número realmente grande como um trilhão. Em seguida, faça o mesmo, gere um ID, mas coloque zero nele para que todos os IDs tenham o mesmo número de dígitos. Em seguida, concatene o ID com a sequência aleatória. Será aleatório o suficiente para a maioria dos propósitos, mas a seção de ID garantirá que ela também seja exclusiva.
fonte
Você pode usar esse código, espero que seja útil para você.
Detalhes sobre o gerador de código aleatório no PHP
fonte
Simplificando o código Scotts acima, removendo loops desnecessários que estão desacelerando muito e não o tornam mais seguro do que chamar openssl_random_pseudo_bytes apenas uma vez
fonte
openssl
não está causando isso, é por causa do viés do módulo em sua declaração de retorno. 100 (intervalo) não divide 255 (1 byte) uniformemente e causa esses resultados. Meu maior problema com sua resposta é que você declara que a função é tão segura quanto usar um loop, o que é falso. Sua implementação de crypto_rand_secure não é criptograficamente segura e é enganosa.openssl
mais seguro, mas o mais importante é que não o torna menos seguro, essa resposta sim. O código acima pega um número aleatório perfeitamente bom e o manipula enviesando-o para números mais baixos. Se você colocar um aviso de isenção de responsabilidade na sua resposta, afirmando que é mais rápido (removendo o loop), mas não é um CSPRNG, resolveria esse problema. Por favor, pelo amor à criptografia, informe aos usuários que a saída dessa função pode ser tendenciosa e não é uma solução equivalente. O loop não existe apenas para incomodá-lo.