如何使用Stanford PRNG生成随机字符串?

时间:2014-06-13 18:18:41

标签: javascript random prng sjcl

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

2 个答案:

答案 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)

  1. 生成一个包含39个随机字节的数组,每个字节0..255

  2. 将您的数组表示为Base64字符串。这将是52个字符长。互联网上将提供Javascript Base64编码器。

  3. 剪掉字符串的最后两个字符(或前两个字符或第一个和最后一个字符)。

  4. 如果您想在浏览器中使用生成的随机字符串,那么您可能需要浏览器安全版本的Base64:a-z A-Z 0-9 -_代替:a-z A-Z 0-9 +/

    有关Base64的详细信息,请参阅RFC 4648