节点中的getRandomValues():"期望Uint8Array"

时间:2016-06-05 01:48:58

标签: javascript node.js npm cryptography

我试图将getRandomValues()函数用于我正在进行练习的加密REST API。我使用Node作为服务器。因此,我知道我没有一个窗口对象,它也包含通常包含" getRandomValues()"的加密对象。功能

每当我测试它时,我都会收到此错误:TypeError: expected Uint8Array

此错误发生在此函数的第3行:

getrand: function (places) {
  var array = new Uint32Array(20);
  getRandomValues(array);

  var ret = array[0];
  for (var i = 1; i < array.size; i++) {
    ret *= array[i];
  }

  ret = this.shiftnum(ret, 10);
  return ret;
},

此外,我已经使用var getRandomValues = require('get-random-values);

导入了npm包

我查看了该软件包的文档,并看到了一些stackoverflow的答案,其中有人给出了使用该软件包的示例。直接来自package page的代码段示例位于:

var getRandomValues = require('get-random-values');

var array = new Uint32Array(10);
getRandomValues(array);
// => [ 
// =>   183, 
// =>   76, 
// =>   18, 
// =>   177, 
// =>   73, 
// =>   9, 
// =>   50, 
// =>   248, 
// =>   216, 
// =>   104 
// => ] 

这也是我在示例中看到的相同格式。我还尝试使用一个非常简单的测试函数来调试此问题,如下所示:

test: function() {
  var array = new Uint32Array(10);
  getRandomValues(array);
  console.log(array[0]);
  return;
}

完全相同的问题发生在第三行。另外,我尝试将var array = new Uint32Array(10);行更改为var array = new Uint8Array(10);只是为了幽默错误,但错误仍然完全相同。

基本上,我试图弄清楚为什么这不起作用。我已经搞砸了几天,无法弄清楚我做错了什么。

提前谢谢。

2 个答案:

答案 0 :(得分:2)

我发现了自己的错误:

  

getRandomValues(BUF)   使用加密随机填充基于整数的TypedArray buf   数字。检查并使用以下第一项:

     

window.crypto.getRandomValues

     

window.msCrypto.getRandomValues

     

Node.js crypto

     

如果以上都不可用,则抛出错误。

     

如果buf.length&gt;则抛出QuotaExceededError; 65536(即使Node.js   加密,没有这个限制,正在使用。)

     

如果使用Node.js加密,则buf必须是Uint8Array,否则为a   将抛出TypeError。

显然我使用的是Node.js加密,因此我需要一个Uint8Array。我不知道之前发生了什么,但是这次改变我的代码后它才起作用。

答案 1 :(得分:0)

该软件包旨在通过require('crypto').randomBytes在浏览器或节点上运行,因为您只希望它在节点上工作,您可以使用自己的函数randomBytes

var crypto = require('crypto') 
var array = crypto.randomBytes(10).toJSON().data
console.log(array)
// [ 233, 217, 45, 204, 150, 171, 160, 70, 18, 138 ]

请注意randomBytes返回缓冲区