urandom和random区别
linux中提供了 /dev/urandom 和 /dev/random 两个特殊设备来提供随机数。那么这两个文件有什么区别呢?
要回答这个问题,先需要了解熵这个概念。
熵
linux是根据系统的熵池来产生随机数的。熵池就是系统当前的环境噪音,环境噪音的来源很多,键盘的输入、鼠标的移动、内存的使用、文件的使用量、进程数量等等。
当系统的熵不够大的时候,则系统产生的随机数随机效果就不是很好,也就是说更容易被人猜测出来。
如何查看系统中的熵
通过下面命令可以查看系统熵池的容量:
cat /proc/sys/kernel/random/poolsize
结果为:
4096
通过下面命令可以查看系统熵池中拥有的熵数:
cat /proc/sys/kernel/random/entropy_avail
结果为:
3793
通过下面命令可以查看从熵池中读取熵的阀值,当 entropy_avail 中的值少于这个阀值,读取 /dev/random 会被阻塞:
cat /proc/sys/kernel/random/read_wakeup_threshold
结果为:
64
如何快速生成熵
通过开启 haveged 服务可以快速产生熵。若 entropy_avail 的值小于1000,则建议安装 haveged,否则加密程序会阻塞直到系统有足够的熵后才继续运行。
pacman -S haveged --noconfirm
然后开启 haveged 服务
systemctl enable havegedsystemctl start haveged
/dev/random 与 /dev/urandom 的区别
/dev/random 是真随机数生成器,它会消耗熵值来产生随机数,同时在熵耗尽的情况下会阻塞,直到有新的熵生成.
/dev/urandom 是伪随机数生成器,它根据一个初始的随机种子(这个种子来源就是熵池中的熵)来产生一系列的伪随机数,而并不会在熵耗尽的情况下阻塞。
但是 若在系统启动阶段使用 =/dev/urandom= 则可能存在熵池中还不存在任何熵的情况,这时用 =/dev/urandom= 产生的随机数是可预测的!
结合两者的特点,可以看出,除非要在启动启动阶段产生随机数,否则绝大多数情况下还是使用 /dev/urandom 来产生随机数,这样才不会引起程序莫名的挂起。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话