5

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

4

2 回答 2

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);
}

不过,这在旧版浏览器中不起作用。因为我使用了window.btoa()。

于 2014-12-23T00:04:51.627 回答
1
  1. 生成一个由 39 个随机字节组成的数组,每个0..255.

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

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

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

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

于 2014-06-14T13:05:04.490 回答