379 votes

Garantir un jeton au hasard en Node.js

Dans cette question, Erik doit générer une sécurité aléatoire jeton dans Node.js. Il y a la méthode crypto.randomBytes qui génère de façon aléatoire un Tampon. Cependant, l'encodage base64 dans le nœud n'est pas d'url-sûr, il inclut / et + au lieu de - et _. Par conséquent, la façon la plus simple de générer un tel jeton que j'ai trouvé est

require('crypto').randomBytes(48, function(ex, buf) {
    token = buf.toString('base64').replace(/\//g,'_').replace(/\+/g,'-'));
});

Est-il un moyen plus élégant?

475voto

thejh Points 20901

Essayez ceci :

Toutefois, le codage « hex » fonctionne uniquement dans le nœud v0.6.x ou plus récent (enfin, en fait il déjà travaillé dans certaines versions de 0.5.x, aussi).

349voto

phoenix2010 Points 133

Option synchrone au cas où si vous n’êtes pas un expert comme moi JS. Devait passer du temps sur la façon d’accéder à la variable de fonction inline

111voto

Yves M. Points 1439

1. Codage en Base 64 avec l'URL et le nom de fichier en Sécurité de l'Alphabet

Page 7 de RCF 4648 explique comment encoder en base 64 avec l'URL de la sécurité. Vous pouvez utiliser une bibliothèque existante comme base64url pour faire le travail.

La fonction sera:

var crypto = require('crypto');
var base64url = require('base64url');

/** Sync */
function randomStringAsBase64Url(size) {
    return base64url(crypto.randomBytes(size));
}

Exemple d'utilisation:

randomStringAsBase64Url(20);
// Returns 'AXSGpLVjne_f7w5Xg-fWdoBwbfs' which is 27 characters length.

Notez que le retour de la longueur de la chaîne ne correspondra pas à la taille de l'argument (de taille != finale de longueur).


2. Crypto valeurs aléatoires de jeu de caractères limité

Vous pouvez également créer une forte chaîne aléatoire à partir d'un ensemble limité de personnages tels que:

var crypto = require('crypto');

/** Sync */
function randomString(length, chars) {
    if(!chars) {
        throw new Error('Argument \'chars\' is undefined');
    }

    var charsLength = chars.length;
    if(charsLength > 256) {
        throw new Error('Argument \'chars\' should not have more than 256 characters'
            + ', otherwise unpredictability will be broken');
    }

    var randomBytes = crypto.randomBytes(length)
    var result = new Array(length);

    var cursor = 0;
    for (var i = 0; i < length; i++) {
        cursor += randomBytes[i];
        result[i] = chars[cursor % charsLength]
    };

    return result.join('');
}

/** Sync */
function randomAsciiString(length) {
    return randomString(length,
        'abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789');
}

Exemple d'utilisation:

randomAsciiString(20);
// Returns 'rmRptK5niTSey7NlDk5y' which is 20 characters length.

randomString(20, 'ABCDEFG');
// Returns 'CCBAAGDGBBEGBDBECDCE' which is 20 characters length.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X