問題描述
使用Ruoyi-cloud 二開,將服務部署到虛擬機上后,準備登錄,發現驗證碼一致加載不出來,接口請求超時!
解決步驟
- telnet 虛擬機ip+port 發現可以通.
- curl 接口,發現一致不返回,超時了.
- /code 接口超時,一步一步log,測試后發現在迭代驗證碼時超時,詢問ai.
結論
SecureRandom.getInstancestrong()方法會返回一個"強"隨機數生成器,它需要收集足夠的系統熵(隨機性)才能生成隨機數。在某些系統環境下,特別是虛擬機或源不足的服務器上,這個過程可能會阻塞很長時間,等待系統收集足夠的隨機熵。
學習到的知識
什么是系統熵?
熵源包括:
- 鍵盤敲擊的時間間隔
- 鼠標移動的軌跡和時間
- 硬盤讀寫的時間差
- 網絡數據包到達的時間
- 中斷發生的時間
- CPU溫度變化
- 內存訪問模式
- 系統調用的時間差
Linux系統中的熵:
存儲在 /dev/random 和 /dev/urandom 中內核維護一個熵池,收集各種不可預測的事件可以通過 cat /proc/sys/kernel/random/entropy_avail 查看當前可用熵
為什么會阻塞?
熵不足的情況:
- 虛擬機環境:缺少真實硬件的隨機性
- 服務器環境:無鍵盤鼠標交互,硬件活動單一
- 嵌入式設備:硬件資源有限
- 剛啟動的系統:還沒收集足夠的隨機事件
SecureRandom.getInstanceStrong()
→ 要求高質量熵
→ 熵池不足時等待
→ 系統收集更多隨機事件
→ 阻塞直到熵足夠
不同隨機數生成器的區別
-
new Random()
偽隨機數生成器
基于算法,可預測
性能最好,但不安全 -
new SecureRandom()
使用系統熵,但有后備算法
熵不足時使用算法擴展
平衡了安全性和性能 -
SecureRandom.getInstanceStrong()
要求最高質量的熵
熵不足時會阻塞等待
最安全但可能性能很差