一、詳細介紹加密、解密技術
現在的加密/解密技術主要有三種:對稱加密,非對稱加密,和單向加密
這三種加密解密技術的組合就是現在電子商務的基礎,它們三個有各自最適合的領域,而且所要完成的功能也是不同的,大家都知道,只要我們連上互聯網,那麼我們就相當於大門洞開,我們的一些隱私,跟其他人對話內容等都有可能會被人竊聽,最常見的比如man in the middle(中間人),它主要是因爲雙方身份無法驗證的時候回話被劫持造成的,就是說通信雙方都以爲是在跟對方交流,其實內容都可能已經被這個“中間人”修改過,一些重要的信息也被這個“中間人”所獲得,這對於現在的電子商務來說是致命的,所有我們必須找到一種解決方案來解決這個問題
對稱加密:指的是加密方和解密方使用的是同一個密鑰
優點:加密解密的速度很快
缺點:如果兩個從未通信過的用戶要進行通信的時候,該如何把解密的密鑰傳輸給對方呢(密鑰仍然要在網絡上傳輸,所以密鑰還是可能會被“中間人”截獲),這是對稱加密最大的缺點;
常見的對稱加密算法有:
DES:使用56位的密鑰,2000年的時候被人破解了,所以現在基本不再使用
AES:高級加密標準,可以使用128,129,256三種長度密鑰
其他的還有blowfish,Twofish和RC6,IDEA(商業算法),CAST5等
非對稱加密:非對稱加密方式解決了對稱加密的缺陷,它的加密和解密密鑰是不同的,比如對一組數字加密,我們可以用公鑰對其加密,然後我們想要將其還原,就必須用私鑰進行解密,公鑰和私鑰是配對使用的,常見的非對稱加密算法有:
RSA:既可以用來加密解密,又可以用來實現用戶認證
DSA:只能用來加密解密,所以使用範圍沒有RSA廣
非對稱加密長度通常有512,1024,2048,4096位,最常用的就是2048位,長度固然可以增加安全性但是需要花費很長時間來進行加密/解密,和對稱加密相比,加密/解密的時間差不多是對稱加密的1000倍,所以我們通常用其作爲用戶認證,用對稱加密來實現數據的加密/解密
單項加密:單向加密就是用來計算一段數據的特徵碼的,爲了防止用戶通過“暴力破解”的方式解密,所以單向加密一般具有“雪崩效應”就是說:只要被加密內容有一點點的不同,加密所得結果就會有很大的變化。單項加密還有一個特點就是無論被加密的內容多長/短,加密的結果(就是提取特徵碼)是定長的,用途:用於驗證數據的完整性,常用的單項加密算法
MD5:這種加密算法固定長度爲128位
SHA1:這種加密算法固定長度是160位
下圖是幫助我們理解加密算法在Internet上的使用所作的說明:
解釋如下,先說BOB和ALICE通信階段
黑框A:表示要傳輸的數據
黑框B:就是單項加密對這段數據提取的特徵碼,這段特徵碼同時運用了非對稱加密,具體過程是用BOB的私鑰加密,傳輸給ALICE,只要到達後ALICE能解密,表明對方確實是BOB。這一過程同時起到了用戶認證和數據完整性的校驗。黑框B又稱爲數字簽名
紅框A:這一階段會生成一段很長的隨機數(密鑰)然後配合對稱加密算法對黑框A和黑框B加密,但是我們如何把加密的密鑰傳輸給ALICE呢?這就要用到紅框B了
紅框B:這一階段是用ALICE的公鑰加密這串隨機數(對稱加密階段的密鑰),ALICE接受到數據後如果能用自己私鑰解密,那就證明接受者確實ALICE
加密過程:
第一步:用單向加密算法提取數據(黑框A)的特徵值
第二步:用自己的私鑰加密這段特徵值形成黑框B
第三步:用對稱加密算法,對黑框A和黑框B來加密,得到紅框A
第四步:用ALICE的公鑰來加密第三步所用的密鑰,得到紅框B
解密過程:
第一步:ALICE用自己的私鑰解密紅框B得到對稱加密的密鑰
第二步:用這個密鑰解密紅框A內容
第三步:用BOB的公鑰解密黑框B,如果能成功,說明發送方確實是BOB,這就完成了身份驗證(解密後會得到一串數據的特徵值)
第四步:用同樣的單項加密算法來對這段數據提取特徵值,如果和第三步的特徵值一樣,說明這段數據是完整的,這就完成了數據完整性的校驗
進行完上述內容厲害的讀者會發現一個問題就是BOB和ALICE如何獲得對方的公鑰,或者說如何證明獲得的公鑰就是對方,這就需要引入另一方證書頒發機構CA,下面是對證書頒發機構跟BOB/ALICE之間的解釋
黑框C:代表要頒發給BOB/ALICE的公鑰,組織,地址等信息
黑框D:是對黑框C進行單向加密後得到的數字簽名,然後用自己的私鑰對其加密,傳輸給BOB和ALICE,拿着這個證書頒發機構的公鑰(這些證書頒發機構的公鑰一般已經被microsoft事先放在windows裏面,當然其他操作系統也是一樣的)的BOB和ALICE如果能對這個證書進行解密,說明這個證書頒發機構不是冒充的
紅框E:表示頒發給BOB和ALICE的證書
二、openssl使用詳解
在講述之前首先要知道openssl中有如下後綴名的文件
.key格式:私有的密鑰
.crt格式:證書文件,certificate的縮寫
.csr格式:證書籤名請求(證書請求文件),含有公鑰信息,certificate signing request的縮寫
.crl格式:證書吊銷列表,Certificate Revocation List的縮寫
.pem格式:用於導出,導入證書時候的證書的格式,有證書開頭,結尾的格式
常用證書協議
x509v3:IETF的證書標準
x.500:目錄的標準
SCEP: 簡單證書申請協議,用http來進行申請,數據有PKCS#7封裝,數據其實格式也是PKCS#10的
PKCS#7: 是封裝數據的標準,可以放置證書和一些請求信息
PKCS#10: 用於離線證書申請的證書申請的數據格式,注意數據包是使用PKCS#7封裝這個數據
PKCS#12: 用於一個單一文件中交換公共和私有對象,就是公鑰,私鑰和證書,這些信息進行打包,加密放在存儲目錄中,CISCO放在NVRAM中,用戶可以導出,以防證書服務器掛掉可以進行相應恢復。思科是.p12,微軟是.pfx
openssl主要組成部分
OpenSSL:主要有三個部分組成 [root@stu2~]# rpm -ql openssl /usr/lib64/libcrypto.so.10 #libcrypto主要實現加密解密的工具 /usr/lib64/libssl.so.10 #主要實現ssl功能的 /usr/bin/openssl #多用途的命令行程序 [root@stu2~]# openssl version #查看openssl的版本號 OpenSSL1.0.0-fips 29 Mar 2010
對文件進行加密測試:
[root@stu2~]# cp /etc/fstab ./ #複製文件到當前目錄下 [root@stu2~]# ls anaconda-ks.cfg boot fstab install.log install.log.syslog ks.cfg [root@stu2~]# openssl enc -des3 -in fstab -e -out fstab.des3 #對文件進行加密測試輸出到fstab.des3 enterdes-ede3-cbc encryption password: #輸入密碼 Verifying- enter des-ede3-cbc encryption password: #再次輸入相同密碼 [root@stu2~]# ls #查看 anaconda-ks.cfg fstab install.log ks.cfg boot fstab.des3 install.log.syslog [root@stu2~]# cat fstab.des3 Salted__)申.2t~?..?? #後面的省略掉了
說明: openssl enc指定加密的類型,des3表示使用對稱加密, -in指定要加密的文件,-e表示加密,-out指定加密後要保存的位置
對文件進行解密測試:
[root@stu2~]# ls anaconda-ks.cfg fstab install.log ks.cfg boot fstab.des3 install.log.syslog [root@stu2~]# rm -f fstab #刪除原文件 [root@stu2~]# ls anaconda-ks.cfg boot fstab.des3 install.log install.log.syslog ks.cfg [root@stu2~]# openssl enc -des3 -in fstab.des3 -d -out fstab enterdes-ede3-cbc decryption password: #輸入加密時的密碼 [root@stu2~]# ls anaconda-ks.cfg fstab install.log ks.cfg boot fstab.des3 install.log.syslog [root@stu2~]# cat fstab #查看文件明文的列出了一部分 # #/etc/fstab #Created by anaconda on Sat Aug 10 08:33:02 2013
說明: openssl enc指定加密的類型,des3表示對稱加密,-in 表示加密後的文件, -d表示解密, -out表示解密後要保存的位置,實驗中爲當前目錄
用單向加密算法獲取文件的特徵碼
[root@stu2~]# rm -f fstab.des3 [root@stu2~]# ls anaconda-ks.cfg boot fstab install.log install.log.syslog ks.cfg [root@stu2~]# openssl dgst -md5 fstab #用md5單向加密算法獲取文件的特徵碼 MD5(fstab)=70adea925c86b2fa91e6a4900b31508a [root@stu2~]# openssl dgst -md5 -hex fstab #獲取16進制的特徵碼,默認就是16進制的可以省略 MD5(fstab)=70adea925c86b2fa91e6a4900b31508a [root@stu2~]# vim fstab #在文件第一行添加一個# [root@stu2~]# openssl dgst -md5 -hex fstab #重新獲取文件的特徵碼 MD5(fstab)=f8bd8f3c19697c85d4d683b0c4f0169b#和之前的特徵碼幾乎完全不同,這就是所謂的雪崩效應
需要知道的是除了用上述命令獲取文件的特徵碼之外,還可以通過md5sum fstal來獲取,結果是相同的,
[root@stu2~]# openssl dgst -md5 -hex fstab MD5(fstab)=f8bd8f3c19697c85d4d683b0c4f0169b [root@stu2~]# md5sum fstab f8bd8f3c19697c85d4d683b0c4f0169b fstab
測試當前主機所支持的加密算法的速率的
[root@stu2~]# openssl speed des-ede3 Doingdes ede3 for 3s on 16 size blocks: 3298403 des ede3's in 2.99s Doingdes ede3 for 3s on 64 size blocks: 828631 des ede3's in 2.99s Doingdes ede3 for 3s on 256 size blocks: 209735 des ede3's in 2.99s Doingdes ede3 for 3s on 1024 size blocks: 52521 des ede3's in 3.00s Doingdes ede3 for 3s on 8192 size blocks: 6691 des ede3's in 2.98s OpenSSL1.0.0-fips 29 Mar 2010 builton: Thu Feb 21 23:42:57 UTC 2013 options:bn(64,64)md2(int) rc4(16x,int) des(idx,cisc,16,int) aes(partial) blowfish(idx) compiler:gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN-DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -DTERMIO -Wall -O2 -g -pipe -Wall-Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector--param=ssp-buffer-size=4 -m64 -mtune=generic -Wa,--noexecstack-DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DSHA1_ASM-DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DWHIRLPOOL_ASM The'numbers' are in 1000s of bytes per second processed. type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes desede3 17650.32k 17736.58k 17957.24k 17927.17k 18393.51
計算密碼值openssl passwd
[root@stu2~]# openssl passwd -1 -salt 12345678 Password: $1$12345678$85L2ohc0YJ4r/l1LAa6co1 說明:其中-1表示基於md5的加密算法,-salt添加一些額外數(一般爲8位),當前最好使用無規律的隨機數,通過幫助文檔可以進行查看man sslpasswd [root@stu2~]# openssl rand -hex 4 #隨機生產8位隨機數 2c58639e [root@stu2~]# openssl passwd -1 -salt `openssl rand -hex 4`#通過salt後加密計算密碼值 Password: #輸入密碼 $1$ca64684d$tQyI7a.yLwbQRMulUBMCI/ #生成的密碼值 # man sslpasswd # openssl passwd -1 -salt
生成RSA算法的私鑰:
[root@stu2~]# openssl genrsa; GeneratingRSA private key, 512 bit long modulus .++++++++++++ ................++++++++++++ eis 65537 (0x10001) -----BEGINRSA PRIVATE KEY----- MIIBOQIBAAJBAJnZzY3oIvGIG8CJFoXp0QHd1VvyFGmSvIvDMAfFgmuzfL8E3uk0 joZDq6HEnNxiAl+KFdheZeB2qluD2lZy9dUCAwEAAQJAEjnvVCRwH1UUlJapCGxO yn3RTPc829T6aURSaFlJviByWdgKLnOsr/HpBaF4/LGJXKcRdCRLC33CGBrSNFmc 8QIhAMskRtZ0xls0fjmCo8EnYOJBjmGjT5e8in19Ekc0KSy3AiEAweIl9k25q53J XuFz/rf0ZWtjkH2sC72MgI7iIiGAvdMCIDz9Gzdvv83KKMtjaX6oL/I99F1kBpVr ybh7QG2YP3RpAiAGRA7CBQUJHNJTNKoRA1TsqinPk6ApyPhvdy6rt7V3bQIgDqQ7 ZquRPTo8QGCGrevqZBUowjeqczOzQaWup9nMlNg= -----ENDRSA PRIVATE KEY----- [root@stu2~]# openssl genrsa 2048 > lian.key #可以指定生成私鑰的位數,並重定向文件中 GeneratingRSA private key, 2048 bit long modulus .............................................+++ .....+++ eis 65537 (0x10001) [root@stu2~]# cat lian.key #可以進行查看
需要注意的是,私鑰文件是至關重要的,不能讓人們輕易的查看,因此我們可以對生成的私鑰文件進行加密
[root@stu2~]# openssl genrsa -des3 2048 > lian.key #對生成的私鑰文件進行單向加密 GeneratingRSA private key, 2048 bit long modulus ......................................................................................................................................+++ ............................................+++ eis 65537 (0x10001) Enterpass phrase: Verifying- Enter pass phrase: [root@stu2~]# cat lian.key #查看加密後的私鑰文件 -----BEGINRSA PRIVATE KEY----- Proc-Type:4,ENCRYPTED #表示該私鑰已經被加密 DEK-Info:DES-EDE3-CBC,3E3043F0CDBAA02E
對私鑰進行加密,雖然相對比較安全,但是對用戶也帶來了一定的麻煩,因爲用戶每次使用私鑰時都需要輸入密碼,因此對私鑰文件權限的設置是非常必要的
[root@stu2~]# (umask 077;openssl genrsa -out lian2.key 2048) GeneratingRSA private key, 2048 bit long modulus ..........................................................+++ ..+++ eis 65537 (0x10001) [root@stu2~]# ll total84 -rw-------.1 root root 2801 Aug 10 08:44anaconda-ks.cfg drwxr-xr-x 3 root root 4096 Aug 11 12:32 boot -rw-r--r-- 1 root root 1051 Aug 21 15:34 fstab -rw-r--r--.1 root root 43809 Aug 10 08:44 install.log -rw-r--r--.1 root root 9963 Aug 10 08:41install.log.syslog -rw-r--r-- 1 root root 1388 Aug 11 12:32 ks.cfg -rw------- 1 root root 1679 Aug 21 16:14 lian2.key -rw-r--r-- 1 root root 1743 Aug 21 16:06 lian.key
需要注意的是:這裏的umask設置權限一定要加上括號不然後面創建所有的文件都會變成此權限的,因爲它是一直生效的;使用括號表示此命令在一個子shell中執行,完成子shell退出
從私鑰文件中提出公鑰:
[root@stu2~]# openssl rsa -in lian2.key -pubout writingRSA key -----BEGINPUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuRr/Yy9xPDYowj2Cf+vS apaSvOHmj33tpm80NAzB7IOvkC8oiulj6oUoowWT1xHEuGbyOJILQEBwN4/Jgm+S IN6/r8gLssY4UBUj34T9ZHnAD0jEgPxRrQTiWSe1SlCStwkCR3RPlBUNXUAySa7X St70Fg9gKIlz4HNMZRrXFgxgFSVE0i4sWFCwrDeIbAzTx2/cGJVtQcYSMrdaKDAH NdgcqKNI0aQSwX9HvTxRtX4sfl7XbqXiyUUJVyuZ4jIxI7yKyii68y/Pk3mIz6mL g5XOa15Jw9ggKHY5gd7g+nr4iioHMQQ/WI8Bargs1ftwESw5lKddQBnLgn2aTpxe 1QIDAQAB -----ENDPUBLIC KEY-----
三、講述如何申請證書:
1)首先要生成一個私鑰文件
2)製作一個證書籤署請求
3)有CA負責簽署證書
[root@stu2~]# openssl req -new -key lan.key -out lan.csr Youare about to be asked to enter information that will be incorporated intoyour certificate request. Whatyou are about to enter is what is called a Distinguished Name or a DN. Thereare quite a few fields but you can leave some blank Forsome fields there will be a default value, Ifyou enter '.', the field will be left blank. ----- CountryName (2 letter code) [XX]:CN #國家名 Stateor Province Name (full name) []:henan #省份名稱 LocalityName (eg, city) [Default City]:Zhengzhou #城市名稱 OrganizationName (eg, company) [Default Company Ltd]:lanlian #公司名稱 OrganizationalUnit Name (eg, section) []:tech #部分名稱 CommonName (eg, your name or your server's hostname) []:www.lanlian.com #證書擁有者的名稱,若使用域名訪問這裏使用域名,如用ip地址訪問這裏一定是Ip地址 EmailAddress []: #郵箱地址,可以省略不寫 Pleaseenter the following 'extra' attributes tobe sent with your certificate request Achallenge password []: #將請求加密起來輸入密碼,不想直接回車即可 Anoptional company name []:
說明:openssl req 證書籤署請求和證書生成工具,-key指定私鑰文件的存放路徑,-new指定證書申請,當前命令的後面可以加-days明確指定證書申請有效使用期限,-out 指定證書申請保存的位置通常以.csr結尾,要了解更多信息可以通過man req進行查看
詳解自建CA過程:
首先查看解析配置文件
#cd/etc/pki/tls
#vimopenssl.cnf
列出了重要的一部分:
#################################################################### [ca ] default_ca = CA_default # The default ca section #################################################################### [CA_default ] #默認CA的配置 dir = /etc/pki/CA # Where everything is kept自建CA的工作目錄 certs = $dir/certs # Where the issued certs are kept指定當前CA的證書存放位置 crl_dir = $dir/crl # Where the issued crl are kept指定證書撤銷列表所在的工作目錄 database = $dir/index.txt # database index file.將簽署的證書製作成索引保存下來也就是數據庫文件 #unique_subject= no # Set to 'no' toallow creation of #several ctificates with same subject. new_certs_dir = $dir/newcerts # default place for new certs.新簽證書的位置 certificate = $dir/cacert.pem # The CA certificate CA自己證書位置 serial = $dir/serial # The current serial number已簽署的證書,序列號 crlnumber = $dir/crlnumber # the current crl number已吊銷證書的個數 # mustbe commented out to leave a V1 CRL crl = $dir/crl.pem # The current CRL當前的證書吊銷文件 private_key = $dir/private/cakey.pem# The private key證書頒發機構自己的私鑰文件 RANDFILE = $dir/private/.rand # private random number file
#cd/etc/pki/CA
[root@stu2CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048) #爲CA生成一個私鑰 [root@stu2CA]# ls private/ cakey.pem [root@stu2 CA]# openssl req -new -x509 -keyprivate/cakey.pem -out cacert.pem -days 3656 Youare about to be asked to enter information that will be incorporated intoyour certificate request. Whatyou are about to enter is what is called a Distinguished Name or a DN. Thereare quite a few fields but you can leave some blank Forsome fields there will be a default value, Ifyou enter '.', the field will be left blank. ----- CountryName (2 letter code) [XX]:CN Stateor Province Name (full name) []:henan LocalityName (eg, city) [Default City]:zhengzhou OrganizationName (eg, company) [Default Company Ltd]:lanlian OrganizationalUnit Name (eg, section) []:tech CommonName (eg, your name or your server's hostname) []:www.magedu.com EmailAddress []: [root@stu2CA]# ls cacert.pem certs crl newcerts private [root@stu2CA]# touch serial index.txt [root@stu2CA]# echo 01 > serial [root@stu2CA]# ls cacert.pem certs crl index.txt newcerts private serial
進行證書籤署:
[root@stu2~]# openssl ca -in lan.csr -out lan.crt -days 3656 Usingconfiguration from /etc/pki/tls/openssl.cnf Checkthat the request matches the signature Signatureok CertificateDetails: Serial Number: 1 (0x1) Validity Not Before: Aug 21 09:20:01 2013GMT Not After : Aug 25 09:20:01 2023GMT Subject: countryName = CN stateOrProvinceName = henan organizationName = lanlian organizationalUnitName = tech commonName = www.lanlian.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 6C:0F:54:43:9A:73:B2:74:FF:2E:59:16:E6:FD:D7:EE:C3:7D:0A:0B X509v3 Authority Key Identifier: keyid:59:56:89:9D:46:10:65:8B:F0:B4:EB:ED:C2:21:A0:CC:E4:9F:F4:FE Certificateis to be certified until Aug 25 09:20:01 2023 GMT (3656 days) Signthe certificate? [y/n]:y 1out of 1 certificate requests certified, commit? [y/n]y Writeout database with 1 new entries DataBase Updated
總結:上述介紹加密認證技術等相關介紹在網絡通信等各方面都有很重要的作用,若有不足之處,希望大家多多提醒,具體應用在上篇的ftps已經詳細介紹,這裏就不再贅述,希望對大家有所幫助!