openssl是一个开源的加密工具箱,实现了SSL和TLS协议,并提供了通用的加密库。除了将libssl.so连接到本身的程序使用,还能够经过命令行使用openssl的全部功能。
1.入门
openssl提供了一个命令行工具,可使用命令行直接使用openssl,好比计算某个文件的MD五、SHA-1等摘要。
openssl sha1 /home/fumin/text
openssl md5 /home/fumin/text
此外openssl还提供了SHA22四、SHA25六、SHA512等强度更高的摘要。此类命令被称为消息摘要命令(message digest command)。
很奇怪的是,openssl没有help命令,不过输出一个非法命令,好比help,它会打印出合法命令列表。也没有-h选项,输入一个非法选项,好比-h,也会打印出该命令的合法选项。
除了消息摘要命令,openssl还提供了另外两种命令,标准命令(standard command)和编码加密命令(encoding and cipher command)。好比base64编码,-in和-out命令分别指定输入输出文件:
openssl base64 -in /home/fumin/text -out base.out
而标准命令能够用于产生ca证书等,能够参考
openssl生成CA证书。
2.性能
openssl库自建了一个benchmark,经过speed命令就能够对benchmark进行测试。
openssl speed
或者
openssl speed sha1
openssl speed md5
下面是我在一台Intel i7八核CPU测试的结果,编译优化级别为3:
Doing md5 for 3s on 16 size blocks: 8137417 md5's in 3.00s
Doing md5 for 3s on 64 size blocks: 6382055 md5's in 2.99s
Doing md5 for 3s on 256 size blocks: 3805509 md5's in 2.99s
Doing md5 for 3s on 1024 size blocks: 1451911 md5's in 2.99s
Doing md5 for 3s on 8192 size blocks: 213993 md5's in 2.99s
Doing sha1 for 3s on 16 size blocks: 7856183 sha1's in 2.98s
Doing sha1 for 3s on 64 size blocks: 5542152 sha1's in 2.99s
Doing sha1 for 3s on 256 size blocks: 2934038 sha1's in 2.99s
Doing sha1 for 3s on 1024 size blocks: 1017265 sha1's in 3.00s
Doing sha1 for 3s on 8192 size blocks: 143313 sha1's in 2.99s
有意思的是,这里显示的是3秒内执行的操做数,而不是执行指定操做所需的时间,这样在不一样机器上的测试时间就不会差异很大。3秒内,能够计算143313个8192B块的sha1摘要,换算成吞吐率是373.2MB/s。这比我使用的sha1.c源码要快不少,-o3选项它只能达到100MB/s每秒的速度。md5的速度更快,达到了557.3MB/s。
3.素数
现代的加密技术很是依赖素数,因此openssl能够测试一个数是否为素数。
openssl prime 23
openssl prime -hex 23
经过脚本传递一系列的数字给openssl,就能够产生想要的素数集合。
4.脚本
写了一些脚本,为每一个备份文件计算md5,方便检查数据去重的备份和恢复是否存在bug。
#!/bin/bash
for file in $(ls *.tar)
do
openssl dgst -md5 $file|awk -F' ' '{print $2}' >$file.md5
done
遍历文件夹下的tar文件,为每一个文件计算md5,由于openssl的输出不单单有md5摘要,因此用awk读取其中的md5摘要并重定向到文件。
#!/bin/bash# ./compare_md5.sh tar_dir md5_dirtar_dir=$1md5_dir=$2file_list=`ls $tar_dir`for file in $file_listdo echo $file md5_tmp=`openssl dgst -md5 $tar_dir/$file|awk -F' ' '{print $2}'` echo $md5_tmp md5=`more < $md5_dir/$file.md5` echo $md5 if [ "$md5_tmp" = "$md5" ]; then echo true else echo false fidone
这个脚本验证恢复是否成功。