2011-06-19

[Node.js] 十分な強度のランダム文字列を作る

Math.random() に由来するランダム文字列には十分なエントロピが存在しないので、こんな感じで作ってます。沢山必要な方は fd を開いたままにして再利用すると良いかもしれません。

Base64 できっちりエンコードできるように、最小公倍数(6, 8) = 24 より、24 で割り切れるビット数になるように少し小細工します。

結果を戻り値で欲しいのと、/dev/urandom はローカルにあり、読み取り量も少ないので同期型の API を使用しています。

var fs = require('fs');

function getRandomString() {
    var fd = fs.openSync('/dev/urandom', 'r');
    var str = fs.readSync(fd, 33, 0, 'base64')[0]; // 33bytes = 264bits
    fs.close(fd);

    return str;
}

console.log(getRandomString());
// 実行例: bP/t1gioiyia0s/ECKPT+kpE6TRutrIaeD7vYKdyzNJl