openssl命令行入门

openssl是一个开源的加密工具箱,实现了SSL和TLS协议,并提供了通用的加密库。除了将libssl.so链接到自己的程序使用,还可以通过命令行使用openssl的所有功能。

1.入门


openssl提供了一个命令行工具,可以使用命令行直接使用openssl,比如计算某个文件的MD5、SHA-1等摘要。
openssl sha1 /home/fumin/text
openssl md5 /home/fumin/text

此外openssl还提供了SHA224、SHA256、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_dir

tar_dir=$1
md5_dir=$2
file_list=`ls $tar_dir`
for file in $file_list
do
  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
  fi
done

这个脚本验证恢复是否成功。

posted on 2013-09-10 16:22  OpenNaive  阅读(2387)  评论(0编辑  收藏  举报

导航