.NET 7下Linux平台RandomNumberGenerator.GetBytes()是否使用/dev/urandom?
结论:Ubuntu环境下
System.Security.Cryptography.RandomNumberGenerator.GetBytes确实依赖/dev/urandom 代码层面验证
- 你追踪到的
Interop.RAND.cs中GetRandomBytes调用CryptoNative_GetRandomBytes的链路是正确的:底层CryptoNative_GetRandomBytes在Linux平台会调用OpenSSL的RAND_bytes函数。 - OpenSSL在Linux默认配置下,以
/dev/urandom作为随机数据源(除非手动修改OpenSSL配置)。.NET Runtime在Linux上依赖系统OpenSSL实现,因此GetBytes最终基于/dev/urandom生成随机字节。
关于你提到的测试方法有效性
观察/proc/sys/kernel/random/entropy_avail数值变化无法验证该问题,原因:
/dev/urandom不会消耗内核熵池的可用熵(entropy_avail),它依赖内核CSPRNG(密码学安全伪随机数生成器)生成输出,熵池初始化完成后,即可持续生成伪随机数据,无需实时消耗熵。- 只有
/dev/random会在熵池不足时阻塞,并消耗entropy_avail数值。
替代验证方案
- strace追踪系统调用:运行.NET程序时执行
strace -e trace=open,read <你的程序路径>,若输出中出现打开并读取/dev/urandom的记录,可直接证明。 - 检查OpenSSL配置:查看
/etc/ssl/openssl.cnf,确认未修改默认随机源配置(默认即为/dev/urandom)。
内容的提问来源于stack exchange,提问作者Samuel Henderson
相关产品推荐
相关产品推荐

