簡體   English   中英

來自加密緩沖區的Node.js安全隨機浮動

[英]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寫入InfinityNaN-Infinity緩沖區的-Infinity大。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM