5

Node.js で正確に6ランダムな数字を生成しようとしていますが、これは暗号的に安全である必要があります。これが私のコードです:

var crypto = require('crypto');

crypto.randomBytes(2, function(err, buffer) {
    console.log(parseInt(buffer.toString('hex'), 16));
});

問題は、16 進数から 10 進数に変換しているため、この結果が4または数字になる可能性があることです。5暗号的に安全な関数を維持する方法はありますrandomBytes()が、6 桁の結果を保証しますか?

4

2 に答える 2

3

2 バイトの最大値は 65535 であるため、2 バイトだけを使用すると 6 桁になることはありません。

代わりに 3 バイトを使用し、次を使用して 6 桁に減らしますsubstr

var crypto = require('crypto');
crypto.randomBytes(3, function(err, buffer) {
    console.log(parseInt(buffer.toString('hex'), 16).toString().substr(0,6));
});

別の解決策はrandomBytes、6 桁の値を取得するまで実行することです。

var crypto = require('crypto');
var secureVal = 0;
function generateSecureVal(cb) {
    crypto.randomBytes(3, function(err, buffer) {
        secureVal = parseInt(buffer.toString('hex'), 16);
        if (secureVal > 999999 || secureVal < 100000) {
            generateSecureVal(cb);
        } else {
            cb();
        }
    });
}

generateSecureVal(function(){
    console.log(secureVal);
});

上記の問題は、理論的には終わりのないループに陥る可能性があり、最初の例よりもはるかに多くの CPU サイクルを使用する可能性が高いことです。

于 2013-07-07T22:45:32.483 に答える