【问题标题】:Do I have to reopen /dev/urandom every read?每次阅读都必须重新打开 /dev/urandom 吗?
【发布时间】:2019-06-02 04:21:40
【问题描述】:

我有一个在永远循环中运行的服务器。每隔一段时间,服务器必须执行密码的散列(更具体地说,每次用户注册我的服务时)。散列算法需要一个盐,16 个随机字节,我从/dev/urandom 读取,这是许多人推荐的。

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

我在网上找到的示例通常显示fread 前面紧跟fopen。但这不是很贵吗?

【问题讨论】:

  • 这些天我会改用getentropy(),但你可以这样做。当然,可能会遇到 stdio 缓冲问题(我不知道 glibc 是否专门处理设备文件)。如果您想从随机设备读取,open()read() 通常会更好。
  • 新打开或相同的句柄将起作用。通过保留句柄,您可以节省 fopen 的开销。

标签: c linux random password-hash


【解决方案1】:

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

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

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

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

打开文件的成本相对较高,尤其是在已经打开文件并因此什么都不做的情况下,但成本是否足够重要取决于打开的频率、程序在同时等因素。但是,我倾向于认为这些都不是您的网络示例的真正考虑因素,因为我判断它们的呈现方式至少部分是出于教学目的。如果您正在编写一个示例,那么显示fopen() 比用文字描述您正在使用的FILE 连接到/dev/urandom 要容易和清晰。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 2010-09-13
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多