一般来说,最好避免打开文件来获取随机数据,因为该过程中有很多故障点。
在最近的 Linux 发行版上,getrandom系统调用可用于获取加密安全的随机数,并且不会失败if GRND_RANDOM
is not指定为标志,读取量最多为 256 字节。
截至 2017 年 10 月,OpenBSD、Darwin 和 Linux(其中-lbsd
)现在都有一个实现arc4random这是加密安全的并且不会失败。这使其成为一个非常有吸引力的选择:
char myRandomData[50];
arc4random_buf(myRandomData, sizeof myRandomData); // done!
否则,您可以像使用文件一样使用随机设备。您从它们中读取并获得随机数据。我在用着open
/read
在这里,但是fopen
/fread
也会同样有效。
int randomData = open("/dev/urandom", O_RDONLY);
if (randomData < 0)
{
// something went wrong
}
else
{
char myRandomData[50];
ssize_t result = read(randomData, myRandomData, sizeof myRandomData);
if (result < 0)
{
// something went wrong
}
}
在关闭文件描述符之前,您可以读取更多随机字节。 /dev/urandom 永远不会阻塞,并且总是填充您请求的字节数,除非系统调用被信号中断。它被认为是加密安全的,应该是您首选的随机设备。
/dev/random 更加挑剔。在大多数平台上,它返回的字节数可能少于您要求的字节数,并且如果没有足够的可用字节数,它可能会阻塞。这使得错误处理变得更加复杂:
int randomData = open("/dev/random", O_RDONLY);
if (randomData < 0)
{
// something went wrong
}
else
{
char myRandomData[50];
size_t randomDataLen = 0;
while (randomDataLen < sizeof myRandomData)
{
ssize_t result = read(randomData, myRandomData + randomDataLen, (sizeof myRandomData) - randomDataLen);
if (result < 0)
{
// something went wrong
}
randomDataLen += result;
}
close(randomData);
}