javascript 如何使用斯坦福大学PRNG生成随机字符串?

gzszwxb4  于 2023-01-01  发布在  Java
关注(0)|答案(2)|浏览(175)

我需要在用户的浏览器中生成一个安全的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字符的字母数字字符串。我在这个主题上的知识是有限的,我在这里寻找一些帮助。

lkaoscv7

lkaoscv71#

我是这样解决的:

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.substring(0, length);
      callback(randomBase64String);
      clearInterval(checkReadyness);
    }
  }, 1);
}

不过这在一些老的浏览器中不起作用,因为我使用了window.btoa()。

krcsximq

krcsximq2#

1.生成39个随机字节的数组,每个字节为0..255
1.将数组表示为Base64字符串。长度为52个字符。Internet上提供了Javascript Base64编码器。
1.切掉字符串的最后两个字符(或前两个字符,或第一个和最后一个字符)。
如果要在浏览器中使用生成的随机字符串,则可能需要Base64的浏览器安全版本:改为a-z A-Z 0-9 -_a-z A-Z 0-9 +/
有关Base64的详细信息,请参见RFC 4648

相关问题