在这个问题中Erik需要在Node.js中生成一个安全的随机令牌。这是crypto方法。生成一个随机Buffer的randomBytes。但是,节点中的base64编码不是url安全的,它包含/和+而不是-和_。因此,我发现生成这种令牌的最简单方法是
require('crypto').randomBytes(48, function(ex, buf) {
token = buf.toString('base64').replace(/\//g,'_').replace(/\+/g,'-');
});
还有更优雅的方式吗?
零依赖解决方案…适用于浏览器,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()
Crypto-random-string是一个很好的模块。
const cryptoRandomString = require('crypto-random-string');
cryptoRandomString({length: 10}); // => '2cf05d94db'
cryptoRandomString({length: 10, type: 'base64'}); // => 'YMiMbaQl6I'
cryptoRandomString({length: 10, type: 'url-safe'}); // => 'YN-tqc8pOw'
cryptoRandomString({length: 10, type: 'numeric'}); // => '8314659141'
cryptoRandomString({length: 6, type: 'distinguishable'}); // => 'CDEHKM'
cryptoRandomString({length: 10, type: 'ascii-printable'}); // => '`#Rt8$IK>B'
cryptoRandomString({length: 10, type: 'alphanumeric'}); // => 'DMuKL8YtE7'
cryptoRandomString({length: 10, characters: 'abc'}); // => 'abaaccabac'
cryptoRandomString.async(options)如果你想获得一个承诺,添加.async。