it-swarm-pt.tech

Crie um token aleatório em Javascript com base nos detalhes do usuário

Quero criar uma sequência aleatória (token) que possa ser usada para identificar um usuário, evitando conflitos em potencial com os tokens de outros usuários.

O que eu estava pensando era em um hash MD5 de navigator.userAgent + new Date().getTime() para gerar o token, mas isso requer uma biblioteca Javascript MD5 inteira para o hash, o que eu realmente não quero fazer.

Ele deve ser composto de caracteres A-Z/0-9 e, idealmente, não mais que 32 caracteres. Estou aberto a todas as idéias. Obrigado!

Apenas para esclarecer que não estou procurando nenhum gerador aleatório de sequências, a sequência aleatória deve ser gerada a partir dos detalhes dos usuários disponíveis por meio de Javascript e também pode usar o tempo para evitar possíveis conflitos!

26
fire

Check-out crypto.js projeto. É uma coleção de algoritmos criptográficos. O projeto possui arquivos js separados para cada algoritmo de hash.

5
Josnidhin

Você pode gerar um número aleatório e convertê-lo na base 36 (0-9a-z):

var Rand = function() {
    return Math.random().toString(36).substr(2); // remove `0.`
};

var token = function() {
    return Rand() + Rand(); // to make it longer
};

token(); // "bnh5yzdirjinqaorq0ox1tf383nb3xr"
107
pimvdb

Esta função permite definir o comprimento do token e os caracteres permitidos.

function generate_token(length){
    //edit the token allowed characters
    var a = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".split("");
    var b = [];  
    for (var i=0; i<length; i++) {
        var j = (Math.random() * (a.length-1)).toFixed(0);
        b[i] = a[j];
    }
    return b.join("");
}

Basta chamar generate_token

generate_token(32); //returns "qweQj4giRJSdMNzB8g1XIa6t3YtRIHPH"
7
Kareem

Eu uso uma abordagem semelhante a Kareem , mas com menos chamadas de função e operações de matriz incorporadas para um grande aumento no desempenho.

De acordo com um teste de desempenho , esse método também supera a resposta aceita por uma pequena margem. Além disso, fornece um parâmetro n para gerar qualquer tamanho de token de tamanho a partir de uma lista branca de caracteres aceitáveis. É flexível e apresenta bom desempenho.

function generateToken(n) {
    var chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    var token = '';
    for(var i = 0; i < n; i++) {
        token += chars[Math.floor(Math.random() * chars.length)];
    }
    return token;
}
3
ThisClark

É muito improvável, mas Math.random () poderia retornar 0.0. Nesse caso, a solução de pimvdb retornaria "" (string vazia). Então, aqui está outra solução, que retorna em todos os casos uma base aleatória36 com 10 caracteres de comprimento:

function generateToken() {
    Math.floor(1000000000000000 + Math.random() * 9000000000000000)
          .toString(36).substr(0, 10)
}
2
shaack
//length: defines the length of characters to express in the string

const Rand=()=>Math.random(0).toString(36).substr(2);
const token=(length)=>(Rand()+Rand()+Rand()+Rand()).substr(0,length);

console.log(token(40));
//example1:  token(10) => result: tsywlmdqu6
//example2:  token(40) => result: m4vni14mtln2547gy54ksclhcv0dj6tp9fhs1k10
2
Jasp402