Random-Number-Generator

這些隨機字節的安全性如何?

  • May 5, 2022

在我們的 Python 程式碼庫中,生成了一些我們希望加密安全的隨機字節。以前,程式碼是:

capability = "".join(secrets.choice(string.digits) for i in range(33))

我已將其更改為:

capability = secrets.token_bytes(16)

據我估計,第一個版本在 10 位之間選擇了 33 次,因此熵為 33*log 2 (10)=110 位,而第二個版本的熵為 128 位。這個計算正確嗎?

從理論上講,您的數學是正確的。事實上,使用可列印的數字來儲存隨機性是儲存和可讀性之間的權衡。但是,由於您在談論加密安全,所以我想提一點。

在考慮隨機性時,您應該記住兩件事:不可預測性和均勻性。

  • 不是你的情況,但是,如果你使用的是 python 內置外掛random,你有統一性但不是不可預測性,因為它使用了 PRNG。因此,根據 Kerchoff 定律,從密碼學角度講,你得到 0 熵。

  • 如果您正在使用secrets. 它使用(例如在 Linux 中)/dev/urandom這通常被認為是加密安全的 ,除非在某些情況下(例如,在啟動時)你會得到一個估計*量的熵(你實際上無法測量它),你希望它會少一點比你理論上的。

  • 關於是否使用/dev/urandom/dev/random. 你可以在這裡閱讀更多內容,也可以在下面查看 SAI Peregrinus 的評論。

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