【问题标题】:openssl RAND_load_file always returns 0openssl RAND_load_file 总是返回 0
【发布时间】:2016-01-05 06:47:52
【问题描述】:

我正在尝试在 linux 上使用 /dev/random/ 读取数据。

int bytes = RAND_load_file("/dev/random", 16);
printf("%d bytes read", bytes);

这总是输出 0 字节读取。

/dev/random 由软件熵源提供。我确定/dev/random 确实有足够的数据。根据文档RAND_load_file 应该返回没有。读取的字节数,但这没有发生。

【问题讨论】:

  • 您的代码是正确的,问题显然在于阅读/dev/random/。如果没有足够的数据,程序就会等待。您可以尝试检查一些权限,虽然我不需要做任何事情来使它工作。
  • 出于好奇,什么操作系统?是 Debian 吗?据我所知,Debian 是唯一一个没有现代熵收集器的现代桌面/服务器操作系统,它在 2015 年将面临枯竭
  • 这是 RHEL 6。我尝试 cat /dev/random 并且它很活跃。

标签: c ssl random openssl entropy


【解决方案1】:

我正在尝试使用 linux 从 /dev/random/ 读取...

这总是输出 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

【讨论】:

    猜你喜欢
    • 2015-09-27
    • 2014-03-20
    • 2013-04-13
    • 2013-03-30
    • 2016-07-13
    • 2023-04-09
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多