openssl-随机数生成

Posted by 周思进 on June 12, 2021

之前文章C编程-随机数写过随机数的获取方式,如果随机数是用于普通应用场景,那是没问题的;但如果是应用于密钥、初始化向量IV、nonce或者salt值等涉及密码学场景,则应该使用 openssl 提供的随机数生成接口 RAND_bytes。

随机数分两类:真随机数和伪随机数
而伪随机数又分:强伪随机数和弱伪随机数

真随机数是通过硬件来生成,伪随机数是通过软件来生成。弱伪随机数只满足随机性,强伪随机数在此基础上满足不可预测性,而真随机数还满足不可重复性。

分类 特性
真随机数 不可预测、不可重复、随机性
强伪随机数 不可预测、随机性
弱伪随机数 随机性

像 rand 这类接口就属于弱伪随机数生成接口,而 RAND_bytes 则是强伪随机数生成接口,可用于密码学场景。

通过 man 手册查看 RAND_bytes 接口使用说明,可以看到有另一个随机数生成接口 RAND_pseudo_bytes 已废弃,不用了。

需要注意要判断接口 RAND_bytes 是否调用成功,成功返回1。


如果想通过命令方式来随机生成一个随机数用用,可以使用如下命令(命令内部通过 RAND_bytes 接口来生成随机数):

$openssl rand -hex 32


以前有碰到调用 openssl 接口失败的情况,具体原因不清了,只记得在调用前增加了如下操作就可以了,也记录下吧。

RAND_load_file(“/dev/urandom”, 256)