Random-Number-Generator

使用隨機數生成器和帶有 HMAC 等密鑰的散列算法來製作隨機數是否不安全?

  • December 16, 2021

我正在 Arduino Mega 微控制器上建構一個項目,我需要一些隨機數發生器來進行挑戰-響應交換。但我沒能找到一些字母數字字元串生成器。然後我想出了一個想法,使用random()生成隨機整數的函式在你給出的限制中使用另一個密鑰(可以在啟動時自動生成,因為它不需要保持一致)用 HMAC 散列該整數)。

這種方法是否會使我的 nonce 在某種程度上降低安全性?

您使用的方法取決於隨機數的要求。在您描述的情況下,挑戰 - 響應協議,隨機數的要求通常是它是唯一的並且永遠不會被重用。但是,在其他情況下,nonce 也需要不可預測,例如,如果您使用 CBC 模式進行加密。

您可以將 HMAC 與它一起使用,並且對於與它一起使用的雜湊函式,我建議使用 SHA-256。但是,我不建議使用生成 HMAC 的值,random因為這可能會重複,然後你的 nonce 也會重複。一般來說,您不能依賴標準 C 和 POSIX 中 PRNG 的質量。您可以改用單調遞增的計數器,這將確保它永遠不會重複,但您必須有某種方法在使用之間保持計數器。

random()是垃圾。請參閱此處的一些來源。

生成隨機數的最佳方法是通過真正的隨機數生成器,除非您希望每秒超過 10,000 個隨機數,這在微控制器情況下是不可能的。您可以使用Arduino Entropy Library做到這一點,而無需任何額外的硬體。該庫利用 AVR 時鐘和看門狗定時器之間的自然抖動。這是環形振盪器中常用的 TRNG 設計的一個很好的研究領域。或者推出您自己的變體(如果您查看原始程式碼,這並不難)。

它不是很快(64 位/秒),但它會在不到兩秒的時間內為您提供真正隨機的 96 位隨機數。這樣你就不需要跟踪使用過的隨機數。它是重啟證明。

引用自:https://crypto.stackexchange.com/questions/96109