[英]Node.js Secure Random Float from Crypto Buffer
當然,這並不是出於任何實際目的,而是我嘗試使用Node的加密模塊生成一個安全的隨機浮點數。 本質上,以下內容:
var crypto = require('crypto');
var buf = crypto.randomBytes(4);
var float = buf.readFloatBE();
據以下測試可以證明,在平均0.40%的情況下,這是行不通的。 我沒有得到浮動,而是得到了NaN
。
var colors = require('colors');
var crypto = require('crypto');
var buf = new Buffer(4);
var fails = 0, tries = 100000;
var failures = [];
for (var i = 0; i < tries; i++) {
var num = crypto.randomBytes(4).readFloatBE(0);
try {
buf.writeFloatBE(num, 0);
} catch (e) {
fails++;
failures.push(buf.readUInt32BE(0).toString(2));
}
}
var percent = 100 * fails / tries;
if (fails)
percent = (percent.toFixed(2) + "%").red;
else
percent = '0.00%'.blue.bold;
console.log('Test ' + 'complete'.green.bold + ', ' + percent + ": " + fails + " / " + tries);
fails && console.log('Failed'.red + ' values:', failures.join(', '));
我猜這是由於IEEE單精度浮點數規范引起的,但是我並不確切地知道浮點數如何以二進制形式存儲。
為什么會這樣呢?確切地說,除了簡單地生成浮點數直到獲得有效數字外,我該如何規避呢?
編輯 :當查看過濾的二進制數據時,它們似乎都遵循相同的模式:前8位都已設置。 其他一切都是隨機的。
從當前版本的節點可以明顯看出, 緩沖庫的源代碼在906行中指定noAssert
還檢查以查看提供的Number是否不是NaN
,因此簡單地指定noAssert
寫入Infinity
, NaN
和-Infinity
緩沖區的-Infinity
大。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.