Token aleatório seguro no Node.js
Em esta questão Erik precisa para gerar um token aleatório seguro em Node.js. Existe o método crypto.randomBytesque gera um buffer aleatório. No entanto, a codificação base64 no nó não é segura para URL, inclui /e em +vez de -e _. Portanto, a maneira mais fácil de gerar esse token que encontrei é
Existe uma maneira mais elegante?
Qual é o restante do código?
Não há mais nada necessário. Que descanso você gostaria de ver?
Não importa, eu tenho que trabalhar, era apenas não tem certeza de como você jogou no, mas tem uma melhor compreensão do conceito
Auto-plug descarado, criei outro pacote npm : tokgen . Você pode especificar caracteres permitidos usando uma sintaxe de intervalo semelhante às classes de caracteres nas expressões regulares ( 'a-zA-Z0-9_-').
Isso pode ser conveniente para quem deseja um comprimento de string específico. O 3/4 é para lidar com a conversão de base. / * retorna uma string de comprimento codificada em base64 * / function randomString (length) {return crypto.randomBytes (length * 3/4) .toString ('base64'); } Funciona bem para esses bancos de dados com esses limites de caracteres.
— TheUnknownGeek
Tente crypto.randomBytes () :
A codificação 'hex' funciona no nó v0.6.x ou mais recente.
Parece melhor, obrigado! Uma codificação 'base64-url' seria legal, no entanto.
Obrigado pela dica, mas acho que o OP simplesmente queria a seção 4 da RFC 3548 já padrão "Codificação da Base 64 com URL e alfabeto seguro de nome de arquivo". Na IMO, a substituição dos caracteres é "suficientemente elegante".
— Natevw 7/10
Se você está procurando o que foi node -e "require('crypto').randomBytes(48, function(ex, buf) { console.log(buf.toString('hex')) });"
E você sempre pode fazer buf.toString('base64')para obter um número codificado em Base64.
Ver este answser abaixo para codificação de base 64 com o URL e Nome do ficheiro de segurança do alfabeto
Opção síncrona, caso você não seja um especialista em JS como eu. Tive que gastar algum tempo em como acessar a variável de função inline
— phoenix2010
Também, caso você não queira que tudo esteja aninhado. Obrigado!
— Michael Ozeryansky
Enquanto isso definitivamente funciona, observe que, na maioria dos casos, você desejará a opção assíncrona demonstrada na resposta do thejh.
— Yantrab
@Triforcey, você pode explicar por que geralmente deseja a opção assíncrona?
Os dados aleatórios podem demorar um pouco para serem calculados, dependendo do hardware. Em alguns casos, se o computador ficar sem dados aleatórios, ele retornará algo no seu lugar. No entanto, em outros casos, é possível que o computador atrase o retorno de dados aleatórios (que é realmente o que você deseja), resultando em uma chamada lenta.
0. Usando a biblioteca de terceiros nanoid [NEW!]
Um gerador de ID de string pequeno, seguro e amigável para URL, exclusivo para JavaScript
1. Codificação Base 64 com URL e Alfabeto Seguro de Nome de Arquivo
A página 7 do RCF 4648 descreve como codificar na base 64 com segurança de URL. Você pode usar uma biblioteca existente como base64url para fazer o trabalho.
Observe que o comprimento da string retornada não corresponderá ao argumento size (size! = Length final).
2. Valores aleatórios criptográficos a partir de um conjunto limitado de caracteres
Cuidado com esta solução, a sequência aleatória gerada não é distribuída uniformemente.
Você também pode criar uma sequência aleatória forte a partir de um conjunto limitado de caracteres assim:
var charsLength = chars.length;
var randomBytes = crypto.randomBytes(length);
@ Solução Lexynux 1 (Codificação Base 64 com URL e Alfabeto Seguro de Nome de Arquivo) porque é a solução mais forte em termos de segurança. Essa solução codifica apenas a chave e não interfere no processo de produção da chave.
Obrigado por seu apoio. Você tem algum exemplo de trabalho para compartilhar com a comunidade? Será bem-vindo?
— 28415 alexventuraio
Cuidado que a sequência aleatória gerada não é distribuída uniformemente. Um exemplo fácil de mostrar isso é que, para um conjunto de caracteres de comprimento 255 e comprimento de seqüência de caracteres 1, a chance do primeiro caractere aparecer é duas vezes maior.
@Dodekeract Sim, você está falando de solução 2 .. É por isso que uma solução 1 é muito mais forte
Nanoid Eu adicionei biblioteca de terceiros na minha resposta github.com/ai/nanoid
A maneira correta e atualizada de fazer isso de forma assíncrona usando os padrões ES 2016 de assíncrono e aguardar (no Nó 7) seria o seguinte:
Isso funciona imediatamente no nó 7 sem nenhuma transformação Babel
Eu tenho atualizado este exemplo para incorporar o novo método de passar parâmetros nomeados, conforme descrito aqui: 2ality.com/2011/11/keyword-parameters.html
URL aleatória e string de nome de arquivo segura (1 liner)
— Kedem
Uma resposta maravilhosa em sua simplicidade! Esteja ciente de que ele pode interromper o loop de eventos de maneira indeterminista (relevante apenas se for usado com frequência, em um sistema com carga horária e sensível ao tempo). Caso contrário, faça o mesmo, mas usando a versão assíncrona de randomBytes. Veja nodejs.org/api/…
— Alec Thilenius
Agradável! Solução absolutamente subestimada. Seria ótimo se você renomear "comprimento" para "desiredLength" e iniciar-lo com um valor antes de usá-lo :)
— Florian Blum
Para quem se pergunta, as chamadas ceile slicesão necessárias para os comprimentos desejados que são ímpares. Por comprimentos uniformes, eles não mudam nada.
Com async / wait e promisification .
Gera algo semelhante a VjocVHdFiz5vGHnlnwqJKN0NdeHcz8eM
Olhe para o real_atesES2016, é mais correto.
Maneira do ECMAScript 2016 (ES7)
Maneira do gerador / rendimento
@Jeffpowrs Na verdade, o Javascript está atualizando :) Promessas de pesquisa e geradores!
tente aguardar, outro manipulador de promessas ECMA7
Eu acho que você deve fazer o ES 2016 o primeiro exemplo desta, uma vez que está se movendo em direção ao "caminho certo para fazê-lo" na maioria dos casos
Adicionei uma resposta própria abaixo, específica para o Node (usando require em vez de import). Houve um motivo específico para o uso da importação? Você tem babel correndo?
@real_ate Na verdade, eu voltei a usar o CommonJS até a importação ser oficialmente suportada.
https://www.npmjs.com/package/crypto-extra possui um método para isso :)
— jsonmaur
ótimo! Mas não é .randomString (length, charset)(consulte a documentação ). Então você pode usar, por exemplo crypto.randomString(12).
O módulo npm anyid fornece API flexível para gerar vários tipos de ID / código de string.
Para gerar uma sequência aleatória em A-Za-z0-9 usando 48 bytes aleatórios:
Para gerar apenas um alfabeto de comprimento fixo, sequência preenchida por bytes aleatórios:
Internamente, ele usa crypto.randomBytes()para gerar aleatoriamente.
Aqui está uma versão assíncrona tirada literalmente de cima da resposta de @Yves M.
function createCryptoString(length, chars) { // returns a promise which renders a crypto string
if (!chars) { // provide default dictionary of chars if not supplied
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
reject('parm chars length greater than 256 characters' +
' masks desired key unpredictability');
resolve(result.join(''));
// --- now generate crypto string async using promise --- /
var wantStringThisLength = 64; // will generate 64 chars of crypto secure string
createCryptoString(wantStringThisLength)
.then(function(newCryptoString) {
console.log(newCryptoString); // answer here
Função simples que fornece a você um token que é seguro para URL e possui codificação base64! É uma combinação de 2 respostas acima.