我需要在用户浏览器中生成一个安全的50个字符的随机字符串。
看sjcl.prng到目前为止我已经得到了这个:
$(document).ready(function () {
sjcl.random = new sjcl.prng(8);
sjcl.random.startCollectors();
$("body").on('mousemove', function() {
console.log(sjcl.random.getProgress(8));
if(sjcl.random.isReady(8) === 2) {
sjcl.random.stopCollectors();
console.log(sjcl.random.randomWords(5,8));
}
});
});
将鼠标移动一段时间后,我得到一个像这样的字节数组:[-579285364, 1099191484, 94979086, -1572161987, -570940948]
。
但我正在寻找的是一个50个字符的字母数字字符串。我对这个主题的了解有限,我在这里寻求帮助。
答案 0 :(得分:5)
以下是我如何解决它:
function createRandomString (callback, length) {
var randomBase64String = '',
checkReadyness;
checkReadyness = setInterval(function () {
console.log(length);
if(sjcl.random.isReady(10)) {
while(randomBase64String.length < length) {
randomInt = sjcl.random.randomWords(1, 10)[0];
randomBase64String += btoa(randomInt);
}
randomBase64String = randomBase64String.substr(0, length);
callback(randomBase64String);
clearInterval(checkReadyness);
}
}, 1);
}
This doesn't work in older browsers though. Because I used window.btoa().
答案 1 :(得分:1)
生成一个包含39个随机字节的数组,每个字节0..255
。
将您的数组表示为Base64字符串。这将是52个字符长。互联网上将提供Javascript Base64编码器。
剪掉字符串的最后两个字符(或前两个字符或第一个和最后一个字符)。
如果您想在浏览器中使用生成的随机字符串,那么您可能需要浏览器安全版本的Base64:a-z A-Z 0-9 -_
代替:a-z A-Z 0-9 +/
有关Base64的详细信息,请参阅RFC 4648。