我需要一个随机的字节序列来制作密码哈希。在Ruby中,这看起来像:
File.open("/dev/urandom").read(20).each_byte{|x| rand << sprintf("%02x",x)}
在Node.js中,我可以得到一个随机字节序列:
var randomSource = RandBytes.urandom.getInstance();
var bytes = randomSource.getRandomBytesAsync(20);
但问题是,如何将这些转换为String?
另外,我需要将它们包含在promisses中。这会有用吗?
get_rand()
.then(function(bytes) {
authToken = bytes;
})
答案 0 :(得分:19)
答案 1 :(得分:4)
您可以使用节点附带的加密:
var Promise = require("bluebird");
var crypto = Promise.promisifyAll(require("crypto"));
crypto.randomBytesAsync(20).then(function(bytes){
console.log('random byte string:', bytes.toString("hex"));
});
日志:
random byte string: 39efc98a75c87fd8d5172bbb1f291de1c6064849
答案 2 :(得分:2)
randbytes
异步工作。如果你想将它与promises结合起来,你还需要使用Promises-lib。我使用when
作为示例:
var when = require('when');
var RandBytes = require('randbytes');
var randomSource = RandBytes.urandom.getInstance();
function get_rand() {
var dfd = when.defer();
randomSource.getRandomBytes(20, function(bytes) {
dfd.resolve( bytes.toString('hex') ); // convert to hex string
});
return dfd.promise;
}
// example call:
get_rand().then(function(bytes) {
console.log('random byte string:', bytes);
});
答案 3 :(得分:0)
您想将int转换为ASCII吗?如果没有,这是我的代码(1分钟的工作):
var z;
randomSource.getRandomBytes(20, function(){z=arguments[0]})
z
<Buffer c8 64 03 d1 2d 27 7d 8e 8f 14 ec 48 e2 97 46 84 5a d7 c7 2f>
String(z)
'�d\u0003�-\'}��\u0014�H��F�Z��/'
答案 4 :(得分:0)
如果您使用的是ES6,那么它也很容易
String.fromCharCode(...bytes)
Promise.resolve(String.fromCharCode(...bytes)) // Promise
或
String.fromCharCode.apply(null, bytes)
Promise.resolve(String.fromCharCode.apply(null, bytes)) // Promise