Postgres 的 uuid_generate_v4 是安全随机的吗?

信息安全 验证 应用安全 随机的 PostgreSQL
2021-09-04 18:46:41

我在 uuid 主键列中使用 Postgres 的 uuid_generate_v4 来生成安全的一次性身份验证令牌。这个可以吗?Postgres 是否使用安全随机数源来生成这些 UUID,或者我应该在将它们插入数据库之前在应用程序端使用安全随机源生成它们?

1个回答

PostgreSQL 文档说 UUID 生成依赖于OSSP查看 OSSP(版本 1.6.2)的源代码表明该代码用于/dev/urandom类 Unix 系统(CryptGenRandom()在 Windows 上),以及基于当前时间、进程 ID 和 C 库rand()函数的弱得多的 PRNG。幸运的是,两个输出是异或在一起的,所以使用/dev/urandom足以保证强随机性,不管另一个 PRNG 有多弱。不幸的是,如果由于任何原因打开/dev/urandom失败(例如,此时进程已用完空闲文件描述符),库将退回到仅使用弱 PRNG,没有警告。

因此,虽然 PostgreSQL 生成的 v4 UUID通常应该包含 122 位的加密强随机性,但总是有可能退化为更弱的行为,没有可靠的方法来测试这种情况。此外,这些似乎都没有真正记录在案,因此它可能会在其他库版本中发生变化。因此,谨慎建议不要依赖 PostgreSQL 生成的 UUID 的强随机性,而应在应用程序端显式使用强随机源(通常/dev/urandom,但隐藏访问错误)。