openssl RAND_load_file始终返回0

时间:2016-01-05 06:47:53

标签: 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确实有足够的数据。根据文档RAND_load_file应该返回否。读取的字节数但是没有发生。

1 个答案:

答案 0 :(得分:0)

  

我尝试使用...读取/ dev / random / on linux

     

这总是输出0字节读数。

根据urandom(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;

问题是您需要float,而不是int。否则,您的熵估计值为0.

int bytes = 128;
float estimate = (float)bytes / 256;
  

/ dev / random由软件熵源提供。我确保/ dev / random确实有足够的数据。

这对我来说有点红旗......你不应该做的一件事在LWN.net上讨论:Don't play dice with random numbers。不要将dev/random/dev/urandom联系起来。你可能应该徘徊到Information Security Stack Exchange并讨论你的需求和方法。

linux random number generator site:lwn.net返回了很多好的阅读材料。我看到了移动操作系统的补丁,这可能会帮助您解决更大的工程问题。

此外,来自同一手册页:

  

如果您的系统没有/ 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