C openssl随机加载文件始终返回0
我正在尝试在linux上使用读取C openssl随机加载文件始终返回0,c,ssl,random,openssl,entropy,C,Ssl,Random,Openssl,Entropy,我正在尝试在linux上使用读取/dev/random/ int bytes = RAND_load_file("/dev/random", 16); printf("%d bytes read", bytes); 这总是输出读取的0字节 /dev/random由软件熵源提供。我确保/dev/random确实有足够的数据。根据docsRAND\u load\u文件应返回读取的字节数,但这不会发生 我正在尝试使用以下命令读取linux上的/dev/random/ 这总是输出读取的0字节 根据Ur
/dev/random/
int bytes = RAND_load_file("/dev/random", 16);
printf("%d bytes read", bytes);
这总是输出读取的0字节
/dev/random
由软件熵源提供。我确保/dev/random
确实有足够的数据。根据docsRAND\u load\u文件
应返回读取的字节数,但这不会发生
我正在尝试使用以下命令读取linux上的/dev/random/
这总是输出读取的0字节
根据Uradom(4)
手册:
字符特殊文件/dev/random和/dev/urandom(存在)
由于Linux 1.3.30)提供了内核随机数的接口
发电机
读取时,/dev/random设备将只返回随机字节
在熵池中估计的噪声位数内。
/dev/random应该适用于需要非常高质量的用途
随机性,如一次性键盘或密钥生成。当
熵池为空,从/dev/random读取的数据将被阻止,直到
收集了额外的环境噪声
有些操作系统会阻塞,比如OpenBSD。其他操作系统不会阻塞,比如Debian和Ubuntu。对于那些在短时间读取时不阻塞的数据,它们返回实际返回的字节数(可能小于请求的字节数)。所以你的第一个问题可能是熵损耗。您应该检查errno
以获取更多信息
我也看到过在向设备添加熵的过程中,在估计熵时使用整数数学的问题。当您尝试从设备中随机抽取数字时,问题会在系统中蔓延并显现出来。比如:
int bytes = 128;
int estimate = bytes / 256;
问题是您需要的是浮点
,而不是int
。否则,熵的估计值为0
int bytes = 128;
float estimate = (float)bytes / 256;
/dev/random由软件熵源提供。我确保/dev/random确实有足够的数据 这对我来说有点危险。。。LWN.net上讨论了一件您不应该做的事情:。不要将
dev/random
链接到/dev/urandom
。你可能应该走近去讨论你的需求和方法
有很多好的读物从我们的网站上返回。我看到移动操作系统的补丁已经讨论过了,这可能会帮助你解决更大的工程问题
此外,以下是同一手册页中的内容: 如果您的系统没有/dev/random和/dev/urandom 已创建,可以使用以下命令创建它们:
mknod -m 644 /dev/random c 1 8
mknod -m 644 /dev/urandom c 1 9
chown root:root /dev/random /dev/urandom
当Linux系统启动时,没有太多操作员交互,
熵池可能处于相当可预测的状态。这
降低熵池中的实际噪波量(低于
估计为了抵消这种影响,它有助于
熵在关闭和启动过程中汇集信息。为此,,
将以下行添加到运行的适当脚本中
在Linux系统启动顺序期间:
echo "Initializing random number generator..."
random_seed=/var/run/random-seed
# Carry a random seed from start-up to start-up
# Load and then save the whole entropy pool
if [ -f $random_seed ]; then
cat $random_seed >/dev/urandom
else
touch $random_seed
fi
chmod 600 $random_seed
poolfile=/proc/sys/kernel/random/poolsize
[ -r $poolfile ] && bytes=`cat $poolfile` || bytes=512
dd if=/dev/urandom of=$random_seed count=1 bs=$bytes
另外,在运行的适当脚本中添加以下行
Linux系统关闭期间:
# Carry a random seed from shut-down to start-up
# Save the whole entropy pool
echo "Saving random seed..."
random_seed=/var/run/random-seed
touch $random_seed
chmod 600 $random_seed
poolfile=/proc/sys/kernel/random/poolsize
[ -r $poolfile ] && bytes=`cat $poolfile` || bytes=512
dd if=/dev/urandom of=$random_seed count=1 bs=$bytes
您的代码是正确的,问题显然是在阅读
/dev/random/
时。如果没有足够的数据,程序就会等待。您可以尝试检查一些权限,尽管我不必做任何事情来让它工作。出于好奇,什么操作系统?是Debian吗?据我所知,Debian是唯一一个没有现代熵收集器的现代桌面/服务器操作系统,它在2015年被耗尽——RHEL 6。我尝试了cat/dev/random,它很活泼。