關(guān)于OpenSSL..
OpenSSL包含一個命令行工具用來完成OpenSSL庫中的所有功能,更好的是,它可能已經(jīng)安裝到你的系統(tǒng)中了。
OpenSSL是一個強大的安全套接字層密碼庫,Apache使用它加密HTTPS,OpenSSH使用它加密SSH,但是,你不應(yīng)該只將其作為一個庫來使用,它還是一個多用途的、跨平臺的密碼工具。
這里簡單說一下OpenSSL的背景,在OpenSSL之前,叫做ssleay,它是一個由Eric A.Young編寫的SSL工具,它不斷改進(jìn)最終變成了OpenSSL,與NCSA的HTTPd變成Apache服務(wù)器的過程非常類似,今天,OpenSSL支持多種加密算法和協(xié)議。
OpenSSL有許多的特征,而且還有SSL客戶端和服務(wù)端特征,OpenSSL還有:
◆美國聯(lián)邦政府NIST FIPS 140-2一級評估確認(rèn)
◆TLS,下一代SSL協(xié)議
◆X.509密鑰和證書的生成
◆X.509證書權(quán)力
◆S/MIME加密
◆文件加密和粉碎
◆打亂UNIX密碼
◆9個不同的商業(yè)密碼硬件設(shè)備
◆密碼性能測試
◆36個命令
◆6個消息摘要算法
◆9個密碼算法
◆多個加密協(xié)議
盡管OpenSSL很復(fù)雜,但是大量的復(fù)雜性可以被避免的,本文剩下的部分將集中在易于使用的特征上,在shell代碼中僅僅需要幾行就可以了。
本文使用與我早期編寫的GnuPG Hacks文章一致的小結(jié)標(biāo)題,以便于比較OpenSSL和GnuPG。
入門
首先,確認(rèn)一下OpenSSL已經(jīng)安裝并處于你的路徑之下,許多Linux發(fā)行版,甚至一下小的發(fā)行版,都包括了OpenSSL,通常,OpenSSL處于/usr/bin/下。
在所有的例子中,shell提示符都是$。
第一步,輸入:
$Content$nbsp;openssl version
注意這里在version選項前是沒有破折號的。
你應(yīng)該看到類似下面這樣的輸出:
OpenSSL 0.9.7d 17 Mar 2004
準(zhǔn)確的版本號,日期和其他可能不同的細(xì)節(jié),寫本文的時候,目前的版本是OpenSSL0.98a,我們正在使用的例子能工作在大部分OpenSSL版本下。
如果你只輸入了openssl,沒有附加任何的參數(shù),你將得到下面這樣的提示符:
OpenSSL>
如果是這樣,只需要輸入quit或按Ctrl-C即可安全地退出,它OpenSSL內(nèi)部命令行提示符,它沒有命令行編輯功能,也沒有明確的幫助功能,但是,如果你輸入一個它不認(rèn)識的命令,它會列出一個可用的命令列表。
二進(jìn)制文件保護(hù)
二進(jìn)制文件典型地用于使用MIME的電子郵件,如果你的電子郵件軟件不支持MIME,如大多數(shù)命令行電子郵件客戶端,你將被uuencode困擾,你可以使用基于64位編碼的OpenSSL,復(fù)雜的MIME協(xié)議也使用的是64位編碼,但是它不能直接兼容MIME。
要使用64位編碼打包二進(jìn)制文件成文本文件,輸入:
$Content$nbsp;openssl base64 < filename.bin > filename.txt
要打開64位編碼的文本文件,輸入:
$Content$nbsp;openssl base64 -d < filename.txt > filename.bin
注意OpenSSL不會關(guān)心文件擴(kuò)展名。
OpenSSL與GnuPG或MIME不一樣,它還能對短字符串進(jìn)行編碼,如下:
$Content$nbsp;echo “The Linux Journal” | openssl base64
VGhlIExpbnV4IepvdXJuYWwK
解碼:
$Content$nbsp;echo “VGhlIExpbnV4IEpvdXJuYWwK” | openssl base64 -d
The Linux Journal
注意-d選項,它意味著解碼。
更好的校驗和
sum和cksum是傳統(tǒng)的UNIX校驗程序,它們工作得很好,只要你不需要跨平臺兼容或安全,你也不用擔(dān)憂會出現(xiàn)2個完全不同的文件有相同的校驗和值。
盡管Linux系統(tǒng)經(jīng)常安裝了md5sum,MD5算法遭受了一個相對較新的漏洞,現(xiàn)在不應(yīng)該使用它。如果它已經(jīng)安裝了,應(yīng)該使用更安全的sha1sum,但是,一些版本只能同時對一個文件進(jìn)行打亂,一些不能處理標(biāo)準(zhǔn)輸入或者有其他的不足,如果你運行這些程序遇到了問題或者你想有一致的、比較知名的、具有良好跨平臺的軟件,建議考慮OpenSSL。
OpenSSL打亂輸出格式與GnuPG有一點不同,但是數(shù)字是相同的,OpenSSL格式總是要鑒定使用的算法,并總是輸出一個小寫的無空白的十六進(jìn)制的字符串,你會發(fā)現(xiàn)這種格式更容易使用。
這里有一些例子:
$Content$nbsp;openssl sha1 filename
SHA1(filename)= e83a42b9bc8431a6645099be50b6341a35d3dceb
$Content$nbsp;openssl md5 filename
MD5(filename)= 26e9855f8ad6a5906fea121283c729c4
在我早前的文章“GnuPG Hacks”中,上面的例子使用了一個包括字符串“The Linux Journal”的文件,注意這個字符串沒有句號。
如果你復(fù)雜這些結(jié)果時遇到了問題,這里提供一個帶ASCII注釋的十六進(jìn)制的表示,注意新行末尾是vi自動加上去的:
OpenSSL與GnuPG不一樣,它沒有SHA-512加密算法,但是OpenSSL有MD2,MD4,MDC2,這些都是舊的算法了,只是為了保持向后兼容,和MD5一樣,現(xiàn)在它們都不應(yīng)該拿來使用。
快速整潔的加密
盡管這不是OpenSSL的強項,但它也能加密文件,靈活的OpenSSL做這件事要比GnuPG復(fù)雜一些。
OpenSSL默認(rèn)選項比較少,因此要使用更多的選項,也有許多算法可供選擇,一些算法如DES和RC4-40,只是為了向后兼容,現(xiàn)在不應(yīng)該再拿來使用了,你應(yīng)該使用強壯的算法如bf(它是Blowfilsh算法的簡稱)和-aes-128-cbc(它是美國NIST高級加密標(biāo)準(zhǔn)—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更復(fù)雜一點:
$Content$nbsp;openssl enc -d -aes-128-cbc -in filename.aes-128-cbc > filename
enter aes-128-cbc decryption password:
注意例子中的-d參數(shù),它意味著解密。
OpenSSL與GnuPG不一樣,不能自動檢查文件的類型或者使用了什么算法也不知道、也不清楚加密文件使用的密鑰的長度和模式。你需要自己保存一個跟蹤記錄,在我的例子中,我將這些信息放在文件擴(kuò)展名里了,OpenSSL不能為你管理文件和文件擴(kuò)展名,你不得不指出輸出數(shù)據(jù)寫入的位置。
如果你沒有指定正確的算法,OpenSSL可能輸出一堆垃圾信息也可能產(chǎn)生一個看不懂的數(shù)字,無論怎樣,沒有正確的給出選項,你的數(shù)據(jù)就不能正確地解密。
密語
在我們更進(jìn)一步之前,我們應(yīng)該先討論一下密語的重要性,在大多數(shù)加密系統(tǒng)中,密語是保存了其他機密的秘密,它通常是最薄弱的點,因此,創(chuàng)建一個強壯的密語是很重要的,但是這也很困難,除非你有好用的工具,使用OpenSSL你就能快速地創(chuàng)建一個強壯的密語。
一個對密語簡單的指導(dǎo)就是長度與優(yōu)勢的比較表,8個字符不夠長(表1),目標(biāo)是創(chuàng)建一個保密性強的而且你又能記住的其他人又不知道的密語,不能靠猜或最后偶爾發(fā)現(xiàn)。
表1 密碼和密語被破解的估計時間強度比較,注意:破解時間是比較粗糙的。
產(chǎn)生一個密語
OpenSSL能創(chuàng)建非常強壯的隨機密語:
$Content$nbsp;openssl rand 15 -base64
wGcwstkb8Er0g6w1+Dm+
如果你運行了這個例子,你的輸出將與這里的輸出不同,因為密語是隨機產(chǎn)生的。
第一個參數(shù)15是產(chǎn)生的二進(jìn)制字節(jié)數(shù),第二個參數(shù)-base64指出那些二進(jìn)制字節(jié)應(yīng)該用基于64位字符編碼,對于15字節(jié)而言,輸出總是20個字符,加上一個新行字符。
基于64位字符設(shè)定了只由大寫和小寫的字母A-Z,數(shù)字1-9和3個標(biāo)點字符:加號、斜線號和等號。這是一個有意的字符限制設(shè)置,更復(fù)雜的字符設(shè)置不是必需的,僅僅增加一個額外的字符使得安全變得不同,例如:一個8位字符完全可打印的ASCII密碼大約與一個9位字符基于64位字符編碼的密碼強度相當(dāng)。
盡管可以使用openssl rand快速生成密語,但是專業(yè)的密語生成器生成強壯的并容易記憶的密語,我強烈推薦使用它。
加密密碼
還有一些事情是GnuPg不能做的,OpenSSL內(nèi)置了一個命令用來創(chuàng)建加密的linux密碼,就象/bin/passwd一樣。
跳過這個段落避免陷入鉆牛角尖的密碼術(shù),盡管通常叫做加密,linux密碼實際上使用的是MD5或舊的UNIX密碼打亂機制(基于DES加密算法),這就允許linux不知道你的密碼,即使你提供了正確的密碼讓它知道了。當(dāng)你設(shè)置你的密碼時,linux打亂你的密碼并保存在/etc/shadow中,當(dāng)你登陸時,linux提取你輸入的密碼并再打亂一次,再與保存在/etc/shadow中的進(jìn)行比較,如果匹配你提供的就是正確的密碼,你就能登陸,如果不匹配,你也不清楚密碼是好多了,因為存儲的是打亂后的數(shù)據(jù),計算機也不會知道你的密碼是好多,反正你是不能登陸進(jìn)去的。
這就是為什么打亂你自己的密碼有用了,假設(shè)你在另一個計算機上需要一個新密碼,或許它是一個新賬號或你忘記了舊的密碼讓管理員給你重設(shè)密碼,如果你能親自告訴管理員,那么沒有問題,但是如果管理員不在怎么辦呢?或許你從來都沒有和管理員見過面,你怎么傳輸你的新密碼?電子郵件是不安全的,電話可能要好一點,郵寄一封信可能要好幾天(可能會有其他安全問題),傳真機,文本消息和大多數(shù)紙張上的東西是不安全的。
更糟糕的是,你可能不信任那個管理員,當(dāng)然,管理員通常就是root,但是其他人可能知道你的密碼,或許你象在其他機器上使用相同的密碼,并且你也不信任那些機器的管理員。
因此,使用下面的方法:
$Content$nbsp;openssl passwd -1
Password:
Verifying – Password:
$1$zmUy5lry$aG45DkcaJwM/GNlpBLTDy0
輸入2次密碼,它不會回顯的,如果你有多個帳戶,就運行多次上面的命令,輸出的內(nèi)容就是密碼加密后的結(jié)果,由于采用的是隨機加密,每次運行結(jié)果都是不一樣的,即使密碼是相同的。
在我的例子中,密碼打亂后是這樣的:
$1$zmUy5lry$aG45DkcaJwM/GNlpBLTDy0
你的密碼打亂后可能與這里完全不同,除了開頭的$1$。
打亂后的密碼【譯者注:實際上通常我們叫做hash值】就能用于電子郵件、傳真、文本消息甚至通過電話交談傳輸給管理員了,管理員據(jù)此可以重新設(shè)置你的密碼hash值。
在管理員收到你的密碼hash值后,它可以手動修改/etc/shadow或使用chpasswd命令,后面需要一個臨時的新文件,叫做newpassword,你的登陸Id和密碼hash值象這樣:
LoginidHere:$1$ywrU2ttf$yjm9OXTIBnoKJLQK2Fw5c/
這個文件可以包括多行,為其他帳戶提供類似的功能。
然后,管理員作為root登陸運行:
chpasswd –encrypted < newpassword
現(xiàn)在,新密碼已經(jīng)設(shè)置好了,一旦你登陸后立即修改你的密碼是個好主意,除非你使用的是一個強壯的密語,這是因為密碼hash值,一旦暴露,就成為離線強制破解的對象,除非這個密碼是真的很長。
這個設(shè)置密碼的方法是相當(dāng)安全的,例如:使用這個技術(shù),某個人能獲取到密碼hash值,創(chuàng)建一個賬號,并知道登陸id和主機名,但是只有原先創(chuàng)建這個用戶的人才知道密碼,即使這個賬號的密碼hash值發(fā)布在雜志上也不用擔(dān)心。
順便說一下,那個hash值對應(yīng)的密碼是完全隨機的基于64位字符編碼的28位長,因此要破解它是非常困難的,但是請注意,不要用那些密碼已經(jīng)公布出來的hash值創(chuàng)建賬號,如:
HXzNnCTo8k44k8v7iz4ZkR/QWkM2
密碼和hash值象下面這樣創(chuàng)建:
$Content$nbsp;openssl rand 21 -base64
HXzNnCTo8k44k8v7iz4ZkR/QWkM2
$Content$nbsp;openssl passwd -1 HXzNnCTo8k44k8v7iz4ZkR/QWkM2
這些例子使用MD5密碼hash值,目前通用的linux系統(tǒng)都是這樣,如果你需要使用舊的UNIX系統(tǒng)hash值,只需要去掉-1參數(shù),例如:
$Content$nbsp;openssl passwd
Password:
Verifying – Password:
xcx7DofWC0LpQ
最后這個密碼hash值的密碼是:TheLinux
密碼基準(zhǔn)測試
OpenSSL支持的許多算法使得它非常合適于密碼基準(zhǔn)測試,這對于比較相同硬件情況下不同算法的性能很有用,并且,它內(nèi)置了一個基準(zhǔn)測試命令。
openssl speed命令,默認(rèn)情況下,在每個單獨支持的模式和選項下運行每個單獨的算法,使用不同的數(shù)據(jù)大小,不同的大小是重要的因為算法啟動過頭了。
完整運行speed需要花費大約6分鐘時間,不考慮硬件的性能,產(chǎn)生29行摘要124行性能數(shù)據(jù)。
但是,注意加密算法的性能嚴(yán)重依賴特定的工具,對于高性能,OpenSSL在x86系統(tǒng)代碼中有幾個算法。其他結(jié)構(gòu)如ia64,SPARC和x86-64,沒有什么系統(tǒng)代碼,沒有列出的架構(gòu)更沒有了,系統(tǒng)代碼放在OpenSSL源代碼目錄:crypto/*/asm,表2和表3節(jié)選了在3個不同的系統(tǒng)上的速度報告。
表2 hash和塊密碼性能(每秒使用1024字節(jié)塊的數(shù)量是1000字節(jié))
表3 公鑰加密性能
學(xué)習(xí)更多
這僅僅是OpenSSL命令行功能的一個樣本。在OpenSSL網(wǎng)站上有更多的文檔,也有幾個郵件列表提供技術(shù)支持。
OpenSSL使用c/c++編寫的,但是它已經(jīng)被移植到其他語言上去了,包括Ruby,而其,在2006年三月通過了FIPS140-2一級評估,使得OpenSSL稱為一個新的在企業(yè)和政府加密領(lǐng)域的競爭者。