是否有PostgreSQL函数可以用/dev/urandom
生成160位随机性?
我们想要生成一个访问令牌。
根据OAuth 2.0 Authorization Framework: 10.10. Credentials-Guessing Attacks:
攻击者猜测生成令牌的概率(以及不打算由最终用户处理的其他凭证)必须小于或等于2 ^( - 128)并且应该小于或等于2 ^( - 160 )。
答案 0 :(得分:3)
就像pozs所说,你可以使用pgcrypto
contrib模块中的gen_random_bytes(int)
。
此函数从src/port/pg_strong_random.c
调用pg_strong_random
,如果返回码为false
,则会抛出错误。
评论解释了pg_strong_random
如何运作:
* Generate requested number of random bytes. The returned bytes are
* cryptographically secure, suitable for use e.g. in authentication.
*
* We rely on system facilities for actually generating the numbers.
* We support a number of sources:
*
* 1. OpenSSL's RAND_bytes()
* 2. Windows' CryptGenRandom() function
* 3. /dev/urandom
*
* The configure script will choose which one to use, and set
* a USE_*_RANDOM flag accordingly.
*
* Returns true on success, and false if none of the sources
* were available. NB: It is important to check the return value!
您可以在PostgreSQL安装中查看include/pg_config.h
,看看使用了哪个随机数源。
如果您使用的是Linux,那么您可能会使用OpenSSL作为随机源。
RAND_bytes()将 num 加密强伪随机字节放入 buf 。
我没有深入研究OpenSSL源,因为这真的很痛,但基本上,如果你信任OpenSSL,你也可以信任pgcrypto
。