在这个问题中Erik需要在Node.js中生成一个安全的随机令牌。这是crypto方法。生成一个随机Buffer的randomBytes。但是,节点中的base64编码不是url安全的,它包含/和+而不是-和_。因此,我发现生成这种令牌的最简单方法是

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

还有更优雅的方式吗?


当前回答

https://www.npmjs.com/package/crypto-extra有一个方法:)

var value = crypto.random(/* desired length */)

其他回答

https://www.npmjs.com/package/crypto-extra有一个方法:)

var value = crypto.random(/* desired length */)

看看real_ates ES2016的方式,它更正确。

2016年ECMAScript (ES7)路

import crypto from 'crypto';

function spawnTokenBuf() {
    return function(callback) {
        crypto.randomBytes(48, callback);
    };
}

async function() {
    console.log((await spawnTokenBuf()).toString('base64'));
};

发电机/收益的方式

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

function spawnTokenBuf() {
    return function(callback) {
        crypto.randomBytes(48, callback);
    };
}

co(function* () {
    console.log((yield spawnTokenBuf()).toString('base64'));
});

使用async/await和承诺。

const crypto = require('crypto')
const randomBytes = Util.promisify(crypto.randomBytes)
const plain = (await randomBytes(24)).toString('base64').replace(/\W/g, '')

生成类似于VjocVHdFiz5vGHnlnwqJKN0NdeHcz8eM的内容

npm模块anyid提供了灵活的API来生成各种字符串ID /代码。

使用48个随机字节在A-Za-z0-9中生成随机字符串:

const id = anyid().encode('Aa0').bits(48 * 8).random().id();
// G4NtiI9OYbSgVl3EAkkoxHKyxBAWzcTI7aH13yIUNggIaNqPQoSS7SpcalIqX0qGZ

生成由随机字节填充的固定长度的字母字符串:

const id = anyid().encode('Aa').length(20).random().id();
// qgQBBtDwGMuFHXeoVLpt

在内部,它使用crypt . randombytes()来生成random。

零依赖解决方案…适用于浏览器,deno和nodejs(新的全局web加密)

Const random = size => String.fromCharCode ( …crypto.getRandomValues ( 新Uint8Array(大小) ) ) ).replaceAll(“+”,“x”)。replaceAll(“/”,“我”)。片(0,大小) For(令I = 5;我——;)console.log(随机(16))

所有doe我只会使用一个uint8array \w预定义的长度,并称为crypto。getRandomValues每当我需要一些uniq(和切片如果我必须),从来不处理字符串或base64, base64只是不必要的开销。 (为fast分配大量缓冲区的成本很高)

const buf256 = new Uint8Array(256)
const random = crypto.getRandomValues.bind(crypto, buf256)

for (let i = 5; i--;) random()//.slice()