在工作中經常會遇到需要字符串加解密,尤其是和linux操作系統打交道的,有些配置文件裏的字符串需要加密,讀取的時候再解密,下面是shell裏openssl的應用。
先介紹一下SSL和OpenSSL
SSL是Secure Socket Layer(安全套接字層)的縮寫,它是一種提供祕密性傳輸的協議。OpenSSL是一個基於密碼學的安全開發包,具有優秀的跨平臺性。它的功能主要包括三個部分:密碼算法庫、SSL協議庫、應用程序。
OpenSSL指令簡介
就像 ls 命令後面跟的選項 -l 、-a等一樣,OpenSSL後面也有很多指令,比如enc、gendsa、genrsa、passwd等,它們實現了不同的功能,在此就不細說了,可以查看OpenSSL相關資料。主要說說 enc 指令。
enc是對稱加密算法工具,它能把數據用不同的對稱加密算法來加密或解密,還能把加密或解密的結果進行base64編碼。enc指令後面也有很多選項,下面列出來一些。
-in filename 要加/解密的輸入文件,缺省爲標準輸入。
-out filename 要加/解密的輸出文件,缺省爲標準輸出。
-pass arg 輸入文件如果有密碼保護,在這裏輸入密碼。
-salt 鹽值,隨機生成的一個字符串,可以包含大小寫字母、數字、字符,位數可以根據要求而不同(也有人說是固定6位隨機數,只能是0~9,a~f),使用不同的鹽值最終的密文是不一樣的。一般在加密之前把鹽值放在字符串前面,然後再加密,但是需要記錄此值。
-nosalt 想和openssl 0.9.5兼容,必須帶有。
-e 把輸入數據加密(默認帶有,可省略)。
-d 把輸入數據解密(不可省略)。
-k password 已過時,爲了和以前的版本兼容,現在用-key代替。
-kfile filename 同上,被passin代替。
-k key 以16進製表示的密碼。
-iv IV 同上。
-p 打印出使用的密碼。
-P 同上,但打完後馬上退出。
0.9.5以後的版本,-salt必須被設置的,如果不寫默認是有的。否則很容易被破解(字典***)。流加密算法也很容易被破解(加密算法分爲塊加密和流加密)。
參考程序:加密
- #用法encstr str key
- function encstr()
- {
- local str_need_enc=$1
- local str_key=$2
- local result=""
- if [ "X" = "X$str_need_enc" ];then
- return 1
- fi
- if [ "X" = "X$str_key" ];then
- return 2
- fi
- result=`echo $str_need_enc |openssl enc -aes-256-cfb -e -base64 -k $str_key -salt`
- echo $result
- return 0
- }
解密
- #用法decstr str key
- function decstr()
- {
- local str_need_dec=$1
- local str_key=$2
- local result=""
- if [ "X" = "X$str_need_dec" ];then
- return 1
- fi
- if [ "X" = "X$str_key" ];then
- return 2
- fi
- result=`echo $str_need_dec |openssl enc -aes-256-cfb -d -base64 -k $str_key`
- echo $result
- return 0
- }