getentropy() 与 RAND_bytes() – Tony Finch

主要观点:

  • 2024 年有新的 POSIX 版本,其中包含getentropy()函数,它是首个官方标准化的获取加密安全随机数的 POSIX API,Linux 上的getentropy(3)基于getrandom(2)系统调用,Linux 6.11 中有新的 vDSO 调用vgetrandom()可在用户态实现getentropy()使其更快。
  • UUID v4v7等需要高性能安全随机数的例子,作者受关于在 PostgreSQL 中无需pgcrypto获取安全随机字节的博客文章启发,开始研究getentropy()
  • 介绍了getentropy()相关内容,包括其定义、便携性、优势(避免/dev/random的问题、无需担心fork或 VM 克隆导致的重复输出等)、劣势(用于获取大量随机字节时需循环、可能比RAND_bytes()慢)以及性能测试(在不同系统和 OpenSSL 版本下与RAND_bytes()的比较)。
  • 结论是getentropy()RAND_bytes()性能相近,一般 OpenSSL 的RAND_bytes()更快,旧版本 OpenSSL 对小缓冲区的性能不如getentropy(),期待 vDSO 基于的getentropy()的比较。

关键信息:

  • 2024 年新 POSIX 版本及getentropy()相关内容。
  • UUID v4等例子。
  • getentropy()的各方面特性及性能测试结果。
  • 最终结论。

重要细节:

  • getentropy()在不同系统和库中的引入时间。
  • getentropy()在不同系统下的性能表现及奇怪现象(如 Mac OS 上的速度变化)。
  • RAND_bytes()性能比较的各种情况。
阅读 18
0 条评论