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
這個腳本驗證恢復是否成功。