在日常的工作中,经常会遇到关于随机数的问题。随机数会在系统中会频繁使用,例如验证码、订单ID、密钥等等。
随机数据很重要,而在linux中如果需要生成随机数据有哪些方式呢?下面我们依次看看都有哪些方式。
使用命令生成随机数据
Unix/Linux环境中大都有一个名为uuidgen的小工具,运行即可生成一个UUID到标准输出,读取文件/proc/sys/kernel/random/uuid即得UUID,例如:
uuidgen命令
从上面的信息来看,生成16进制随机字符串,每次运行uuidgen都产生不同的随机字符串。
dbus-uuidgen 命令
dbus-uuidgen产生的uuid没有-(减号)字符。每次运行dbus-uuidgen都产生不同的随机字符串。
openssl rand 产生随机数
rand命令用来产生伪随机字节,随机数字产生器需要一个seed,在没有/dev/srandom系统下的解决方法是自己做一个~/.rnd文件,如果该程序能让随机数字产生器很满意的被seeded。程序写回一些怪怪的东西回该文件。
语法:
openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num
选项:
-out file:结果输出到file中。
-rand file(s):指定随机数种子文件,多个文件间用分隔符分开,windows用“;”,OpenVMS用“,“,其他系统用“:”。
-base64:输出结果为BASE64编码数据。
-hex:输出结果为16进制数据。
num:随机数长度。
使用选项-hex:输出结果为16进制数据。
使用选项-base64:生成含特殊符号的随机字符串。
算一算,使用base64算法生成的随机数据,其最终长度为(n/3)向上取整后再乘以4。如(1/3)=0.33333,向上取整为1 ,最终base64编码后的长度为1 * 4 = 4位。
使用设备文件生成随机数据
在linux操作系统中默认提供了两个可以生成随机数据的设备文件: /dev/random 和/dev/urandom。很多程序都会调用这些设备生成随机数据,例如:tomcat 、SSH等。
/dev/random依赖系统中断,因此当系统中断不足时该文件是无法提供足够的随机数据的,这样会导致需要使用random设备文件生成随机数据的程序阻塞。
/dev/urandom则不依赖于系统中断,在系统不足时也可以提供足够的随机数据。
这个文件可以提供无限的随机数据,所以需要使用Ctrl +C 组合键才可以中断对这两个文件的查看。
cat /dev/random
random和urandom这两个设备提供的随机数据可能会包含特殊符号,而有些验证码需要是纯数字的,有时密码需要是字母、数字且不包括特殊符号等,所以我们需要使用tr命令对原始数据进行过滤。
回到提取随机验证码或密码的问题,我们可以将random或urandom设备文件提供的多余数据删除,仅保留我们需要的数据,然后结合head之类的工具截取有效应位数的数据。
下面提取10位包含字母、数字和下画线的随机数据。
下面通过Linux系统自带的散列算法的工具,如md5sum、shalsum、sha265sum、sha512sum等,通过这些工具也可以生成随机数据。
需要注意的是,这种方式提取的随机数据都是十进制数,也就是随机数的范围0-9A-F。
echo -a | md5sum
想了解更多md5sum可以参考这篇<Linux下使用md5sum进行检验>
sha256sum 命令 和 md5sum 命令一样的功能,只是使用算法不同,sha256相对 md5sum 更为准确,所以现在很多的系统的发行版都是使用 sha256sum 进行校验。