%E4%BE%86%E7%94%A2%E7%94%9Fstack_canary%E6%88%96stack_top%EF%BC%9F.png)
Linux核心中有一個隨機數產生器。這通常稱為 LRNG(Linux 隨機數產生器)。我們可以透過呼叫來使用它get_random_bytes()
。但stack_canary
和stack_top
是由 產生的get_random_int()
。雖然Linux核心有自己很好的隨機數產生器(LRNG),但是為什麼Linux核心要產生它呢get_random_int()
?我認為這可能是因為效率。這樣對嗎?
答案1
只是閱讀原始碼:
取得僅供內部核心使用的隨機字。與 urandom 類似,但目標是最小化熵池消耗。因此,隨機值在加密上並不安全,但對於多種用途而言,消耗熵的成本太高
這就是為什麼get_random_int
不只獲取 的輸出get_random_bytes
。事實上,這裡的論點是錯的,原因有二:
- 熵實際上並沒有耗盡。這只是內核內部的虛假計算。
- 即使熵確實耗盡了,也沒有理由不使用加密安全的偽隨機數產生器而不是臨時構造。只需使用與耗盡 熵的實例不同的實例即可
/dev/random
。性能可能是一個原因,但適當的 CSPRNG(例如 Hash_DRBG/SHA-2)與此處使用 MD5 的臨時構造之間的差異很小。
答案2
Linux 的/dev/random
、/dev/urandom
、 和get_random_bytes()
綁定到同一個內部熵池。僅用於 RNG 時很可能會耗盡它並導致/dev/random
阻塞並/dev/urandom
產生低熵輸出。這種低熵條件為加密帶來了問題。