我每次读取都必须重新打开/ dev / urandom吗?

时间:2019-01-07 13:36:54

标签: c linux random password-hash

我有一个永远循环运行的服务器。服务器偶尔需要执行一次密码的哈希处理(更具体地说,每次用户注册我的服务时)。哈希算法需要一个盐,随机的16个字节,这是我从/dev/urandom中读取的,这是很多人推荐的。

所以我想:为什么不在服务器启动时只调用一次fopen("/dev/urandom", "rb"),然后根据需要调用fread

我在网上找到的示例通常显示fread紧跟fopen之后。但这不贵吗?

1 个答案:

答案 0 :(得分:6)

/dev/urandom是内核的熵驱动随机数生成器的接口。它有一个手册页,您可以在online中找到该页面,也可以在本地找到。通过fopen()打开它不会对随后可以读取的数据产生任何书面影响。没有记录表明每次打开只能读取一次,也没有合理的限制。

  

所以我想:为什么不只打一次fopen("/dev/urandom", "rb")   服务器的启动,然后根据需要调用fread

您可以这样做。主要成本是您将进程的有限数量的打开文件中的一个永久用于此目的,但这对您来说可能不是问题。

  

我在网络上找到的示例通常显示fread紧随fopen之后。但这不贵吗?

打开文件的成本相对较高,尤其是在已经打开文件并因此无所事事的情况下,但是,文件是否足够昂贵,取决于它执行的频率,程序在运行时或之后可能还要做什么?同时等因素。我倾向于假定这些都不是您的Web示例真正考虑的问题,但是,因为我判断它们的出现是因为它们至少部分是出于教学目的。如果要编写示例,则显示fopen()比用文字描述将您正在使用的FILE连接到/dev/urandom容易得多,而且清晰得多。