n 數據傳輸中常用的加密解密概念
我們通過互聯網發送和接收數據的時候有沒有想過發送的數據會不會別人偷窺或篡改呢? 如果不會被別人偷窺那麼計算機是怎麼做到的呢?這就要了解有關加密解密的相關知識了。
事實上我們的計算機中很多應用在傳送數據的時候都經過不同的加密機制將數據加密後發送,然後接收方通過相對應的解密機制將收到的數據解密。
常用的加密方式
對稱加密DES, 3DES, AES
機密性
非對稱加密(公鑰加密)RSA, DSS, ECC
身份驗正
機密性
密鑰交換
身份驗正的實現方式發送方使用自己的私鑰加密接收方只能用發送方的公鑰解密能解密及驗證了發送方身份。
私鑰加密的數據 --> 與之配對的公鑰解密
公鑰加密的數據 --> 與之配對的私鑰解密
單向加密MD5, SHA1, SHA2, SHA256, SHA512, SHA3
主要功能是通過哈希算法提取數據的特徵碼用來驗證數據沒有被篡改。
數字簽名:發送方使用單向取得數據特徵碼並使用自己的私鑰加密此段特徵碼的操作
通過這些加密解密算法的配合運用保證了數據傳輸的安全性私密性可用性。
n Openssl的應用
一、Openssl簡介
Openssl是一個能實現加密解密和自建CA的開源程序包。主要有三部分組成。
1、Libcrypto是一個能實現加密解密的公共庫。系統中很很多程序都依賴到這個庫。
2、Libssl爲了實現ssl功能。絕大多要實現ssl功能的程序所依賴。https會話層。
3、Openssl實現加密解密多功能的工具。
二、Openssl工具使用方法
我們可以使用openssl 來顯示openssl可用選項及常用命令 。也可以直接man openssl後長跟選項的用法比如你可以實現 man enc 、man dgst...(請自行摸索)這裏我們來用openssl 來展示一下大體選項。
2.1 使用openssl enc 加密數據
這裏我們加密/etc/issue.並保存到當前root家目錄下以issue.des3命名
[root@station57 ~]# openssl enc -des -in /etc/issue -e -out /root/issue.des3 enter des-cbc encryption password: Verifying - enter des-cbc encryption password:
-des表示使用des加密方式
-in要加密的文件
-e加密<----->-d:解密
-out加密後輸出路徑如果我們只是加密不需要保存的話就不用-out了。
命令執行結束後會讓我們輸入加密密碼並確認密碼。
此時/etc/issue文件就已經通過des加密方式加密並保存到/root/issue.des3
[root@station57 ~]# ls anaconda-ks.cfg nginx-1.4.5 httpd issue.des3
因爲是加密過的數據所以我們用cat查看 就是一堆亂碼了
[root@station57 ~]# cat /root/issue.des3 {c応娗)@euFI\…~_W>/慄k|An- 2oX+yMˉ*§E’—*·°IΠFf|~6+rQ
用-d選項查看加密的內容當然這裏必須要輸入剛剛加密的密碼了。
[root@station57 ~]# openssl enc -des -in issue.des3 -d -out issue enter des-cbc decryption password: [root@station57 ~]# cat issue CentOS release 6.4 (Final) Kernel \r on an \m Mage Education Learning Services My neme is xuqimin ,this is my computer; http://www.magedu.com
Ok這就是我們在linux中加密一個文件的過程
當然如果我們僅僅是加密一串數據不需要保存也可以這樣用
[root@station57 ~]# echo 123 | openssl enc -des3 enter des-ede3-cbc encryption password: Verifying - enter des-ede3-cbc encryption password: Salted__???$?d?>??
2.2 使用openssl dgst 獲取數據的特徵碼。(md4、md5、md2..)
鼓勵大家多多用man手冊查看具體使用方法。這裏是man dgst的顯示結果摘要。
openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-c] [-d] [-hex] [-binary] [-out filename] [-sign filename] [-keyform arg] [-passin arg] [-verify filename] [-prverify filename] [-signature filename] [-hmac key] [file...]
我們還以issue這個文件爲例使用openssl dgst獲取它的特徵碼。這裏使用md5
[root@station57 ~]# openssl dgst -md5 issue MD5(issue)= 3642653878b64529471d7a065bd51448
我們往這個文件里加一個小數據“1”.來驗證一下什麼叫md5的雪崩效應。
[root@station57 ~]# echo 1 >> /root/issue [root@station57 ~]# openssl dgst -md5 issue MD5(issue)= b3a7a51a34128a32c6fe7bb193e0160e
看到了吧!僅僅是向issue文件中追加進去一個字符,導致前後特徵碼完全不一樣。小小的變化大大的結果差異。這就是md5的雪崩效應。
2.3 Openssl speed 來測試當前主機的加密速度。
這個命令可以測試你的電腦的加密速度,當然也就反映了你電腦的性能了。
我們來測試一下電腦對sha512加密方法的加密速度
[root@station57 ~]# openssl speed sha512 Doing sha512 for 3s on 16 size blocks: 2680685 sha512's in 2.99s Doing sha512 for 3s on 64 size blocks: 2682484 sha512's in 3.00s ....
如果直接執行 openssl speed 不加參數,則會自動測試每個加密方法的加密速度。
2.4 Openssl passwd 類似linux系統中實現用戶密碼的方法man sslpasswd
[root@station57 ~]# openssl passwd Password: Verifying - Password: Uz1H.qZ3P5JQE [root@station57 ~]# openssl passwd Password: Verifying - Password: JVA6LkZpAtBFw
看到了沒,兩次加密後生成的字符串不一樣。你是不是該說我兩次輸入的祕密一樣結果肯定一樣了。你可真是錯了,我兩次加密的數據是一樣的。但是結果爲什麼不一樣了呢?因爲這個加密工具默認給我輸入的數據前面又添加了點別的隨機字符串salt,所以用每次加密相同的祕密結果卻不一樣。這就像我們linux系統中shadow文件夾中保存的密碼一樣,兩個用戶的密碼一樣,但是經過系統加密保存後卻沒有一位相同。
我們也可以用這個命令加點參數指定salt的值。其他更多選項詳見man sslpasswd
-1:表示使用的加密方式是md5
-salt指定使用的salt
如果兩次指定相同的salt結果也就一樣了。
[root@station57 ~]# man sslpasswd [root@station57 ~]# openssl passwd -1 -salt hellolinux Password: $1$hellolin$U22lq0Cpt4.xQku/mq2G00 [root@station57 ~]# openssl passwd -1 -salt hellolinux Password: $1$hellolin$U22lq0Cpt4.xQku/mq2G00
2.5 Openssl rand 生產隨機數種子
可以用這個命令生成一個隨機數種子,這個隨機數還可以用來充當我們的salt
[root@station57 ~]# openssl rand -hex 3 ea177c [root@station57 ~]# openssl rand -hex 1 bd [root@station57 ~]# openssl passwd -1 -salt `openssl rand -hex 4` Password: $1$5dedff6c$cPfH/zxH3ixNFs6WfthBT0 [root@station57 ~]# openssl passwd -1 -salt `openssl rand -hex 4` Password: $1$4d350d85$gRTZYA6Bubqv1gEutKgD5.
2.6 Openssl genrsa生產RSA私鑰
我們可以直接用命令openssl genrsa生產一串rsa密鑰。但是這樣的密鑰直接放在我們計算機裏也是不安全的。爲了密鑰的安全建議通過下面介紹的方法對密鑰再進行加密
選項
-des3選擇使用des3加密生產的密鑰
1023生成的密鑰位數默認是512位。
-out講生成的密鑰導出到文件當然我們也可以用輸出重定向導出。
2.7 Openssl rsa 從私鑰中提取公鑰
生成一個私鑰保存爲key.pri然後從私鑰中提取出公鑰
[root@station57 ~]# openssl genrsa -out key.pri Generating RSA private key, 512 bit long modulus .........++++++++++++ .........++++++++++++ e is 65537 (0x10001) [root@station57 ~]# openssl rsa -in key.pri -pubout writing RSA key -----BEGIN PUBLIC KEY----- MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALMqqinkFOwbb5LQHRXr18oL2Zch4EAi HgkD2jsR7qXdIdJoQlM+CDkeDJV8EnuX7APrQtbnwLl70W9NqqtUdCkCAwEAAQ== -----END PUBLIC KEY-----
這樣就生成了對私鑰和與之對應的公鑰了
創建完私鑰記得修改權限啊~這可是機密信息。
2.8 Openss req證書製作請求和生成工具
[root@station57 ~]# openssl req -new -key /root/key.pri -out /root/myreq.csr
-new申請一個新證書
-key生成的key的位置
-out製作的請求文件放置的路徑(證書請求文件一般用.csr結尾)
這時候就會在我們的指定的目錄下生成一個證書申請文件myreq.csr,然後我們就可以把這個文件發送到CA機構去讓CA簽署生效了。但是可別忘了讓CA簽名可是要收費了因爲CA要負責驗證你提交的信息是否合法,會去你部門覈實情況。
因此如果單單是爲了測試或者內部網絡使用的話我們自建CA還是比較靠譜的。
Ok學會了openss工具的這個幾個小命令的用法後我們來自建一個CA吧~
n 自建CA詳解
數字證書包含的內容
版本號
序列號():證書本身在CA中惟一標識
簽名算法標誌
發行者名稱
有效期
證書主體名稱(組織,個人)
證書主體公鑰信息
發行商惟一標誌
證書主體的惟一標誌
擴展
簽名
PKI: 需要涵蓋的範圍
端實體(申請者)
註冊機構(RC)
簽證機構(CA)-->簽證機構(CA)
證書撤消列表(CRL)發佈機構
證書存取庫
openssl中有如下後綴名的文件
.key格式私有的密鑰
.crt格式證書文件certificate的縮寫
.csr格式證書籤名請求證書請求文件含有公鑰信息certificate signing request的縮寫
.crl格式證書吊銷列表Certificate Revocation List的縮寫
.pem格式用於導出導入證書時候的證書的格式有證書開頭結尾的格式
整個證書的初始信息需要我們自己填寫,這有點像我們申請貧困證明一樣,我們自己填寫一個表單包含自己個人信息、家庭情況什麼的,然後拿去民政部門覈實,覈實通過蓋一個章然後這個證明就生效了。前面已經講過了證書的請求製作過程的命令Openssl req。
OK,在我們準備使用openssl自建CA的時候先來看一下openssl的配置文件吧。配置文件裏定義了ca各種文件數據保存路徑、吊銷的證書列表、證書申請時候輸入信息匹配設置等等信息,請自行查閱。配置文件位置在/etc/pki/tls/openssl.cnf.
好了廢話不多說了是不是你們也聽煩了 Ok我們來實戰吧...
一、爲CA生成私鑰
主機在網絡通信中需要CA爲其頒發證書,那麼充當CA的服務器本身的證書有誰來頒發呢?由於我們是自建的所以這裏是我們自己的CA自己頒發。因此要自建CA,首先需要CA自己爲自己創建一個證書。
這裏我們首先要切換到 /etc/pki/CA目錄中創建一個私鑰
[root@station57 ~]# cd /etc/pki/CA [root@station57 CA]# ls certs crl newcerts private [root@station57 CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048) Generating RSA private key, 2048 bit long modulus ......................................................................+++ ..........................................................................................................................................................+++ e is 65537 (0x10001) [root@station57 CA]# ll private/cakey.pem -rw------- 1 root root 1679 Mar 8 07:07 private/cakey.pem
上邊命令外的括號表示把此命令放入到子shell中執行,爲了避免設置umask爲077後影響到父shell。
通過以上命令我們在private目錄中生成了一個2048位的私鑰cakey.pem,並且只有管理員有可讀權限
二、生成自簽證書
[root@station57 CA]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out cacer.pem -days 200
-x509自建證書的格式加此參數表示自簽證書
Cacer.pem :此文件名是由配置文件中規定的
-days規定證書有效期天數
三、生成序列號文件數據庫文件
我們已經建成了ca的私鑰和自簽證書,那麼根據配置文件中定義的所需要的文件目錄,我們還缺少兩個文件一個數據庫文件和一個序列號文件。創建之...
[root@station57 CA]# touch serial index.txt [root@station57 CA]# echo 01 > serial [root@station57 CA]# ls cacer.pem certs crl index.txt newcerts private serial
四、Ok.CA已經建好讓我們來發揮它的作用籤個證書吧。
還記得上一項我們介紹openssl工具使用方法的時候創建的那個申請了不也就是上一項第八個例子。 讓我們的CA來爲它簽字吧。
[root@station57 CA]# openssl ca -in /root/myreq.csr -out mycert.crt -days 365 Using configuration from /etc/pki/tls/openssl.cnf Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: Mar 8 01:16:01 2014 GMT Not After : Mar 8 01:16:01 2015 GMT Subject: countryName = CN stateOrProvinceName = Henan organizationName = nyist organizationalUnitName = soft commonName = 172.16.20.61 emailAddress = [email protected] X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 1A:1A:3C:D7:36:19:C5:07:B2:E5:BA:2E:6A:C7:C5:CB:0C:54:78:9F X509v3 Authority Key Identifier: keyid:B0:95:27:ED:A2:A2:40:94:0E:28:36:1A:27:B3:C7:62:CB:14:2E:B5 Certificate is to be certified until Mar 8 01:16:01 2015 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
證書製作好了,那它生成了什麼文件呢,文件內容又是什麼?Ok讓我來帶你們看看
[root@station57 CA]# ls cacert.pem crl index.txt.attr mycert.crt private serial.old certs index.txt index.txt.old newcerts serial [root@station57 CA]# cat index.txt V150308011601Z01unknown/C=CN/ST=Henan/O=nyist/OU=soft/CN=172.16.20.61/[email protected] [root@station57 CA]# cat serial 02
Mycert.crt :這就是我們的證書
Index.tex 記錄着當前籤的證書的信息
Serial證書編號也就是從幾號來開始創建證書。
Ok、、、大功告成~