OpenSSL學習(一):OpenSSL初接觸

OpenSSL包含一個命令行工具用來完成OpenSSL庫中的全部功能,更好的是,它可能已經安裝到你的系統中了。linux

OpenSSL是一個強大的安全套接字層密碼庫,Apache使用它加密HTTPS,OpenSSH使用它加密SSH,可是,你不該該只將其做爲一個庫來使用,它仍是一個多用途的、跨平臺的密碼工具。c++

這裏簡單說一下OpenSSL的背景,在OpenSSL以前,叫作ssleay,它是一個由Eric A.Young編寫的SSL工具,它不斷改進最終變成了OpenSSL,與NCSA的HTTPd變成Apache服務器的過程很是相似,今天,OpenSSL支持多種加密算法和協議。web

OpenSSL有許多的特徵,並且還有SSL客戶端和服務端特徵,OpenSSL還有:算法

◆美國聯邦政府NIST FIPS 140-2一級評估確認 
◆TLS,下一代SSL協議 
◆X.509密鑰和證書的生成 
◆X.509證書權力 
◆S/MIME加密 
◆文件加密和粉碎 
◆打亂UNIX密碼 
◆9個不一樣的商業密碼硬件設備 
◆密碼性能測試 
◆36個命令 
◆6個消息摘要算法 
◆9個密碼算法 
◆多個加密協議shell

儘管OpenSSL很複雜,可是大量的複雜性能夠被避免的,本文剩下的部分將集中在易於使用的特徵上,在shell代碼中僅僅須要幾行就能夠了。安全

本文使用與我早期編寫的GnuPG Hacks文章一致的小結標題,以便於比較OpenSSL和GnuPG。服務器

入門架構

首先,確認一下OpenSSL已經安裝並處於你的路徑之下,許多Linux發行版,甚至一下小的發行版,都包括了OpenSSL,一般,OpenSSL處於/usr/bin/下。 
在全部的例子中,shell提示符都是$。工具

第一步,輸入: 
$Content$nbsp;openssl version 
注意這裏在version選項前是沒有破折號的。性能

你應該看到相似下面這樣的輸出: 
OpenSSL 0.9.7d 17 Mar 2004

準確的版本號,日期和其餘可能不一樣的細節,寫本文的時候,目前的版本是OpenSSL0.98a,咱們正在使用的例子能工做在大部分OpenSSL版本下。

若是你只輸入了openssl,沒有附加任何的參數,你將獲得下面這樣的提示符: 
OpenSSL>

若是是這樣,只須要輸入quit或按Ctrl-C便可安全地退出,它OpenSSL內部命令行提示符,它沒有命令行編輯功能,也沒有明確的幫助功能,可是,若是你輸入一個它不認識的命令,它會列出一個可用的命令列表。

二進制文件保護

二進制文件典型地用於使用MIME的電子郵件,若是你的電子郵件軟件不支持MIME,如大多數命令行電子郵件客戶端,你將被uuencode困擾,你可使用基於64位編碼的OpenSSL,複雜的MIME協議也使用的是64位編碼,可是它不能直接兼容MIME。

要使用64位編碼打包二進制文件成文本文件,輸入: 
$Content$nbsp;openssl base64 < filename.bin > filename.txt

要打開64位編碼的文本文件,輸入: 
$Content$nbsp;openssl base64 -d < filename.txt > filename.bin 
注意OpenSSL不會關心文件擴展名。

OpenSSL與GnuPG或MIME不同,它還能對短字符串進行編碼,以下: 
$Content$nbsp;echo "The Linux Journal" | openssl base64 
VGhlIExpbnV4IepvdXJuYWwK

解碼: 
$Content$nbsp;echo "VGhlIExpbnV4IEpvdXJuYWwK" | openssl base64 -d 
The Linux Journal 
注意-d選項,它意味着解碼。

                              更好的校驗和

       sum和cksum是傳統的UNIX校驗程序,它們工做得很好,只要你不須要跨平臺兼容或安全,你也不用擔心會出現2個徹底不一樣的文件有相同的校驗和值。

儘管Linux系統常常安裝了md5sum,MD5算法遭受了一個相對較新的漏洞,如今不該該使用它。若是它已經安裝了,應該使用更安全的sha1sum,可是,一些版本只能同時對一個文件進行打亂,一些不能處理標準輸入或者有其餘的不足,若是你運行這些程序遇到了問題或者你想有一致的、比較知名的、具備良好跨平臺的軟件,建議考慮OpenSSL。

OpenSSL打亂輸出格式與GnuPG有一點不一樣,可是數字是相同的,OpenSSL格式老是要鑑定使用的算法,並老是輸出一個小寫的無空白的十六進制的字符串,你會發現這種格式更容易使用。

這裏有一些例子: 
$Content$nbsp;openssl sha1 filename 
SHA1(filename)= e83a42b9bc8431a6645099be50b6341a35d3dceb

$Content$nbsp;openssl md5 filename 
MD5(filename)= 26e9855f8ad6a5906fea121283c729c4

在我早前的文章「GnuPG Hacks」中,上面的例子使用了一個包括字符串「The Linux Journal」的文件,注意這個字符串沒有句號。

若是你複雜這些結果時遇到了問題,這裏提供一個帶ASCII註釋的十六進制的表示,注意新行末尾是vi自動加上去的:

OpenSSL與GnuPG不同,它沒有SHA-512加密算法,可是OpenSSL有MD2,MD4,MDC2,這些都是舊的算法了,只是爲了保持向後兼容,和MD5同樣,如今它們都不該該拿來使用。

                    

                            快速整潔的加密

      儘管這不是OpenSSL的強項,但它也能加密文件,靈活的OpenSSL作這件事要比GnuPG複雜一些。

OpenSSL默認選項比較少,所以要使用更多的選項,也有許多算法可供選擇,一些算法如DES和RC4-40,只是爲了向後兼容,如今不該該再拿來使用了,你應該使用強壯的算法如bf(它是Blowfilsh算法的簡稱)和-aes-128-cbc(它是美國NIST高級加密標準—AES,運行在CBS模式下使用128位密鑰)。

這裏有一個例子: 
$Content$nbsp;openssl enc -aes-128-cbc < filename > filename.aes-128-cbc 
enter aes-128-cbc encryption password: 
Verifying - enter aes-128-cbc encryption password: 
與GnuPG同樣,OpenSSL要求提供2次密語,而且不會回顯到屏幕上。

解密也比GnuPG更復雜一點: 
$Content$nbsp;openssl enc -d -aes-128-cbc -in filename.aes-128-cbc > filename 
enter aes-128-cbc decryption password: 
注意例子中的-d參數,它意味着解密。

    OpenSSL與GnuPG不同,不能自動檢查文件的類型或者使用了什麼算法也不知道、也不清楚加密文件使用的密鑰的長度和模式。你須要本身保存一個跟蹤記錄,在個人例子中,我將這些信息放在文件擴展名裏了,OpenSSL不能爲你管理文件和文件擴展名,你不得不指出輸出數據寫入的位置。

若是你沒有指定正確的算法,OpenSSL可能輸出一堆垃圾信息也可能產生一個看不懂的數字,不管怎樣,沒有正確的給出選項,你的數據就不能正確地解密。

密語

在咱們更進一步以前,咱們應該先討論一下密語的重要性,在大多數加密系統中,密語是保存了其餘機密的祕密,它一般是最薄弱的點,所以,建立一個強壯的密語是很重要的,可是這也很困難,除非你有好用的工具,使用OpenSSL你就能快速地建立一個強壯的密語。

一個對密語簡單的指導就是長度與優點的比較表,8個字符不夠長(表1),目標是建立一個保密性強的並且你又能記住的其餘人又不知道的密語,不能靠猜或最後偶爾發現。 
表1 密碼和密語被破解的估計時間強度比較,注意:破解時間是比較粗糙的。

產生一個密語

OpenSSL能建立很是強壯的隨機密語: 
$Content$nbsp;openssl rand 15 -base64 
wGcwstkb8Er0g6w1+Dm+

若是你運行了這個例子,你的輸出將與這裏的輸出不一樣,由於密語是隨機產生的。 
第一個參數15是產生的二進制字節數,第二個參數-base64指出那些二進制字節應該用基於64位字符編碼,對於15字節而言,輸出老是20個字符,加上一個新行字符。

基於64位字符設定了只由大寫和小寫的字母A-Z,數字1-9和3個標點字符:加號、斜線號和等號。這是一個有意的字符限制設置,更復雜的字符設置不是必需的,僅僅增長一個額外的字符使得安全變得不一樣,例如:一個8位字符徹底可打印的ASCII密碼大約與一個9位字符基於64位字符編碼的密碼強度至關。

儘管可使用openssl rand快速生成密語,可是專業的密語生成器生成強壯的並容易記憶的密語,我強烈推薦使用它。

加密密碼

還有一些事情是GnuPg不能作的,OpenSSL內置了一個命令用來建立加密的linux密碼,就象/bin/passwd同樣。

跳過這個段落避免陷入鑽牛角尖的密碼術,儘管一般叫作加密,linux密碼實際上使用的是MD5或舊的UNIX密碼打亂機制(基於DES加密算法),這就容許linux不知道你的密碼,即便你提供了正確的密碼讓它知道了。當你設置你的密碼時,linux打亂你的密碼並保存在/etc/shadow中,當你登錄時,linux提取你輸入的密碼並再打亂一次,再與保存在/etc/shadow中的進行比較,若是匹配你提供的就是正確的密碼,你就能登錄,若是不匹配,你也不清楚密碼是好多了,由於存儲的是打亂後的數據,計算機也不會知道你的密碼是好多,反正你是不能登錄進去的。

這就是爲何打亂你本身的密碼有用了,假設你在另外一個計算機上須要一個新密碼,或許它是一個新帳號或你忘記了舊的密碼讓管理員給你重設密碼,若是你能親自告訴管理員,那麼沒有問題,可是若是管理員不在怎麼辦呢?或許你歷來都沒有和管理員見過面,你怎麼傳輸你的新密碼?電子郵件是不安全的,電話可能要好一點,郵寄一封信可能要好幾天(可能會有其餘安全問題),傳真機,文本消息和大多數紙張上的東西是不安全的。

更糟糕的是,你可能不信任那個管理員,固然,管理員一般就是root,可是其餘人可能知道你的密碼,或許你象在其餘機器上使用相同的密碼,而且你也不信任那些機器的管理員。 
所以,使用下面的方法:

$Content$nbsp;openssl passwd -1 
Password: 
Verifying - Password: 
$1$zmUy5lry$aG45DkcaJwM/GNlpBLTDy0

輸入2次密碼,它不會回顯的,若是你有多個賬戶,就運行屢次上面的命令,輸出的內容就是密碼加密後的結果,因爲採用的是隨機加密,每次運行結果都是不同的,即便密碼是相同的。

在個人例子中,密碼打亂後是這樣的: 
$1$zmUy5lry$aG45DkcaJwM/GNlpBLTDy0 
你的密碼打亂後可能與這裏徹底不一樣,除了開頭的$1$。

打亂後的密碼【譯者注:實際上一般咱們叫作hash值】就能用於電子郵件、傳真、文本消息甚至經過電話交談傳輸給管理員了,管理員據此能夠從新設置你的密碼hash值。

在管理員收到你的密碼hash值後,它能夠手動修改/etc/shadow或使用chpasswd命令,後面須要一個臨時的新文件,叫作newpassword,你的登錄Id和密碼hash值象這樣:

LoginidHere:$1$ywrU2ttf$yjm9OXTIBnoKJLQK2Fw5c/ 
這個文件能夠包括多行,爲其餘賬戶提供相似的功能。

而後,管理員做爲root登錄運行: 
chpasswd --encrypted < newpassword

如今,新密碼已經設置好了,一旦你登錄後當即修改你的密碼是個好主意,除非你使用的是一個強壯的密語,這是由於密碼hash值,一旦暴露,就成爲離線強制破解的對象,除非這個密碼是真的很長。

這個設置密碼的方法是至關安全的,例如:使用這個技術,某我的能獲取到密碼hash值,建立一個帳號,並知道登錄id和主機名,可是隻有原先建立這個用戶的人才知道密碼,即便這個帳號的密碼hash值發佈在雜誌上也不用擔憂。

順便說一下,那個hash值對應的密碼是徹底隨機的基於64位字符編碼的28位長,所以要破解它是很是困難的,可是請注意,不要用那些密碼已經公佈出來的hash值建立帳號,如: 
HXzNnCTo8k44k8v7iz4ZkR/QWkM2

密碼和hash值象下面這樣建立: 
$Content$nbsp;openssl rand 21 -base64 
HXzNnCTo8k44k8v7iz4ZkR/QWkM2 
$Content$nbsp;openssl passwd -1 HXzNnCTo8k44k8v7iz4ZkR/QWkM2

這些例子使用MD5密碼hash值,目前通用的linux系統都是這樣,若是你須要使用舊的UNIX系統hash值,只須要去掉-1參數,例如: 
$Content$nbsp;openssl passwd 
Password: 
Verifying - Password: 
xcx7DofWC0LpQ 
最後這個密碼hash值的密碼是:TheLinux

                            密碼基準測試 

    OpenSSL支持的許多算法使得它很是合適於密碼基準測試,這對於比較相同硬件狀況下不一樣算法的性能頗有用,而且,它內置了一個基準測試命令。 

openssl speed命令,默認狀況下,在每一個單獨支持的模式和選項下運行每一個單獨的算法,使用不一樣的數據大小,不一樣的大小是重要的由於算法啓動過頭了。 

完整運行speed須要花費大約6分鐘時間,不考慮硬件的性能,產生29行摘要124行性能數據。 

可是,注意加密算法的性能嚴重依賴特定的工具,對於高性能,OpenSSL在x86系統代碼中有幾個算法。其餘結構如ia64,SPARC和x86-64,沒有什麼系統代碼,沒有列出的架構更沒有了,系統代碼放在OpenSSL源代碼目錄:crypto/*/asm,表2和表3節選了在3個不一樣的系統上的速度報告。 

表2 hash和塊密碼性能(每秒使用1024字節塊的數量是1000字節) 

表3 公鑰加密性能 


學習更多 

這僅僅是OpenSSL命令行功能的一個樣本。在OpenSSL網站上有更多的文檔,也有幾個郵件列表提供技術支持。  OpenSSL使用c/c++編寫的,可是它已經被移植到其餘語言上去了,包括Ruby,而其,在2006年三月經過了FIPS140-2一級評估,使得OpenSSL稱爲一個新的在企業和政府加密領域的競爭者

相關文章
相關標籤/搜索