天天看點

加密、解密詳解及CA的實作

一、前言

   進入21世紀,人們的生活已經嚴重依賴于網際網路,衣、食、住、行,網際網路已經滲透到生活的第一個角落,這也給某些不良網民們提供了一個絕佳的環境去竊取我們的資訊,讓我們的資訊不再安全。為了應對這些hacker和script boys,我們的白帽們也一直在努力,從沒松懈過。

   因為我還距白帽的能力有些差距,是以這裡就簡單介紹一下網際網路的加密、解密方式、openssl的基本應用及CA的實作過程。

二、加密方式

1、對稱加密

   對稱加密是基于加密算法+密碼的,它主要有兩個特性:

   1)、加密方、解密方使用同一個密碼

   2)、将原文分割成固定大小的塊,對這些塊進行加密

   在加密資料時,由于逐字元加密速度實在是太慢了,是以就選擇了對其按塊進行加密,而且在加密時通常把第一個塊加密以後,再把第二個塊加密,将第一個塊加密後的結果與第二個塊加密之後的結果做異或運算,然後再做為第二個塊的輸出,前後塊形成了塊鍊。是以如果想要看第一塊的内容,必須拿到前一個塊做異或運算,才能得到結果。

   對于一些大的購物網站來說,它需要儲存每個使用者的密鑰,這就造成了一定的麻煩。而且在資料傳輸的過程中是很容易被竊取并篡改,然後進行字典攻擊,無法保證使用者身份認證和資料的完整性的。

   一些對稱加密算法:

   DES:通用加密标準,56bits密鑰

   3DES(triple):進行3輪EDS,

   AES:進階加密标準,128bits密鑰

   Blowfish,Twofish,IDEA,RC6,CAST5,Serpent

2、非對稱加密

   非對稱加密會在本地生成一對密鑰對兒:公鑰和私鑰。公鑰任何人都可以擁有,但私鑰隻有自己擁有,既然有了私鑰,那就可以實作身份認證了。

   非對稱加密的特性

       1)、密鑰交換

       2)、身份認證

   公鑰證書,通常簡稱為證書,是一種數字簽名的聲明,它将公鑰的值綁定到持有對應私鑰的個人、裝置或服務的辨別。證書的主要好處之一是主機不必再為單個使用者維護一套密碼,這些單個使用者進行通路的先決條件是需要通過身份驗證。相反,主機隻需在證書頒發者中建立信任。大多數普通用途的證書基于 X.509 v3 證書标準。

   是以,對于伺服器而言,在與使用者進行互動的過程中,需要時直接管使用者要其公鑰就可以了,隻有其對應的私鑰才能解密,再也不需要記錄那麼多的密鑰了。在密鑰交換的過程中,依然存在密鑰被截取、僞造。

   另外,就算法本身的實作來講,公鑰加密技術比對稱加密技術的速度慢上差不多3個數量級,一個數量級就是10倍,是以3個數量級不是30倍,而是1000倍。是以,在加密資料時是很少用到公鑰去加密的。同樣的,私鑰加密也會很慢。

   一些非對稱加密算法:

   RSA,EIGamal,ESA

3、單向加密

   單向加密是提取資料的特征碼,保證了資料的完整性

   特性:

   1)、one-way:單向的

   2)、collision-free

   3)、資料完整性

   就好比我們在網際網路上下載下傳東西一樣,好多網站都會提供一個MD5碼,我們把下載下傳下來的資料做一個MD5運算就會得到一個特征碼,隻要這個特征碼與網站提供的一樣,那麼就說明這個資料沒有被修改過,那如果二都不一緻,那肯定就是被修改過了的。這也就是傳說中的單向性和雪崩效應,微小的改變會導緻結果的巨大變化。

   一些單向加密算法:

   MD5:128bits

   sha1:160bits

   sha512:512bits

三、加密方式詳解

   就上面三種加密方式而言,單單使用哪一種都不能保證資料的完整性和身份認證。尤其在當今網際網路上的資訊傳輸一定得保證私密性、身份認證和資料完整性。

下面用一張圖來詳解一下當今網際網路加密、解密的流程:

   Bob傳送資料給Alice

<a href="http://s3.51cto.com/wyfs02/M01/22/50/wKioL1Ma6CaRvYXXAAHYqTbXyiU486.png" target="_blank"></a>

解釋:

   加密過程:

   1)、使用單向加密技術加密資料,生成一個特征碼。保證了資料的完整性。

   2)、用Bob的私鑰對生成的特征碼進行加密。隻有Bob有其私鑰,保證了身份認證。

   3)、對資料和加密過的特征碼進行對稱加密。

   4)、用Alice的公鑰加密上一步得到的對稱加密密碼。

   解密過程:

   1)、使用Alice的私鑰先解密對稱加密密碼。

   2)、用得到的對稱加密密碼去解密加密了的資料和特征碼。

   3)、使用單向加密算法加密上一步解密出來的資料。

   4)、使用Bob的公鑰去解密特征碼,得到在Bob發送資料的特征碼。

   5)、比較3,4步中的特征碼是否一緻。

存在問題:

   雖然用了這麼多步加密算法去加密整個過程,但在資料的傳輸過程中還是存在漏洞的。因為Bob和Alice的公鑰依然會在網上傳輸,是以這兩個公鑰仍然有可能被竊取、掉包。這個過程還是不完美的,這就需要一個權威的第三方認證機構CA來給他們發證。

四、openssl的基本應用

   SSL是Secure Socket Layer(安全套接層)的縮寫,可以在Internet上提供秘密性傳輸。OpenSSL實作了SSL協定的SSLv2和SSLv3,支援了其中絕大部分算法協定。openssl是一個多功能指令工具,可生成密鑰、建立數字證書、手動加密解密資料。這裡先介紹openssl的基本使用,接着就使用openssl去建立CA。想要檢視openssl的指令,可以使用openssl ?。

1、标準指令:

   enc,dgst,genrsa,rsautl,req,ca,rsa,passwd

2、opensll提供的算法

   1)、對稱加密算法

        DES 3DES AES Blowfish Twofish IDEA RC6 CAST5 Serpent

   2)、非對稱加密算法

        DHA RSA EIGamal DSA

   3)、資訊摘要算法

        MD5 SHA1 SHA512 CRC-32

   4)、密鑰和證書管理

   密鑰和證書管理是PKI(Public Key Infrastucture)的一個重要組成部分,OpenSSL為之提供了豐富的功能,支援多種标準。在此基礎上,OpenSSL實作了對證書的X.509标準編解碼、并提供了一種文本資料庫,支援證書的管理功能,包括證書密鑰産生、請求産生、證書簽發、吊銷和驗證等功能。OpenSSL提供的CA應用程式就是一個小型的證書管理中心(CA),實作了證書簽發的整個流程和證書管理的大部分機制。

3、使用openssl加密、解密資料

   1)加密/etc/passwd,放到目前目錄下并命名為passwd.openssl。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

<code>[root@nmshuishui ~]</code><code># openssl enc -des3 -a -salt -in /etc/passwd -out ./passwd.openssl</code>

<code>enter des-ede3-cbc encryption password:</code>

<code>Verifying - enter des-ede3-cbc encryption password:</code>

<code>[root@nmshuishui ~]</code><code># ls</code>

<code>anaconda-ks.cfg  </code><code>install</code><code>.log  </code><code>install</code><code>.log.syslog  myiso  </code><code>passwd</code><code>.openssl  scripts  soft  tmp</code>

<code>[root@nmshuishui ~]</code><code># cat passwd.openssl</code>

<code>U2FsdGVkX1+oXyyFLQ034Ff6lvhFeFiYXi+2THWrHl1T5JRKq6Mvy645SpvsCVmf</code>

<code>+JCQxLdJnvGAu3YaQmIYy6biuxRR6e9TKZWt34kd5IJ7BPL71NMj</code><code>/nAbCkfdju7/</code>

<code>R479XedQRIsU2iEQJtgUbJPS08K</code><code>/gdkUlfXTBxLfOkIpxAtC/HZWcPJvIMWno6</code><code>+g</code>

<code>WnH3eh0YJymWIz9BlxzOWFyddGZZyWU3l5Qn3kOEd+2Wl</code><code>/iqAbPzEMxz/wLnxCpt</code>

<code>8pW2P7sDwixtgDPPxHnlRtfxd8+ETcit5+svAPTTt4NXLjt8ZYqK2xf+Uo20liTU</code>

<code>nYWL9S7dH0F+4hV5N0aFmySi5Lu0M5jIe96e5dctA8WiG02L0Hi9nl3JbbXF</code><code>/Fl7</code>

<code>Ns2eC</code><code>/MdqC5P362/um0BxLwamJGcTqDWTB3ltOpjbqTB2x9</code><code>+lLjxtnGKE3ZTUSjI</code>

<code>EWCbrke</code><code>/YErHnuQ35W3VmNqskCbNWs2FV1aiPraDa8C0uyElx5r5KYu2JxlSCyes</code>

<code>edXDdstk8OZKHTiKJqO2HknPMPdBZpAXbNKnM</code><code>/uKmmGOVvpJTmLzAvDACInJeNAN</code>

<code>GZ1lhP7jvNb7/+A8tLhN5Cmnz</code><code>/VK7NDppUeoxOU9ZfjSMOinTObl8R4iV738EaAw</code>

<code>pZooSxGocYA342uN9dCedrbFr7Sk3APP6MAMYXeSvPThgXPQIP9IV9hnDVEhXzqe</code>

<code>RNtuOnYUGhMql8wrlrmhGM7ye1LztTiVPHhtNSfxpxinqlGx9PEqy+UdNjgoKF2B</code>

<code>2oBX8UzFvn85I8edaKe3LUhb22FoLbAlaiPcCoFUgJb7zYfR3RF6WcOaaNy1jLc8</code>

<code>3a59Jnrf1jYgT+NQl1S5jCmQHyRtEGNdi517PlgkDSeCLbFtssZvlPcxD2rBS3HX</code>

<code>1R0HDmJME9dUq1NzY</code><code>/I4PfLbjLnIHUTsuage2PWfHxjuLmi14fUi8QotEy8qJcpo</code>

<code>LmkS3ds1t</code><code>/r9gTTldgcB/PmLKTtLNRNGQXAemMMxsVVTMrqwBcao7wtIy</code><code>+y5d6bk</code>

<code>kuonPLfmhEViSnlDq4WU7CZoSVZp+0d5VNL+y0kFExTcPLIZFOtHYUwHMzdup16L</code>

<code>YIobul9+ZFG0GnMAZ</code><code>/dqHGRwUSdswb7</code><code>+RukJyzR2mCbCwhh0sWuHL5CHeO7UH5pT</code>

<code>XyOAkuJHfx8W8s8mIrm1FN7LmpCnePZOM+sEBCbx7aibIvufn53uFT6u9vvYBxLT</code>

<code>aDPX+7H4rSx08nvx3IOxLku0aCU</code><code>/nV/hKwNqR9ycWBD/avDm</code><code>+d0RRarD3KDUwmM2</code>

<code>tRTbUwSslVR5MeXJNOr+TpSQEracAmY5OboXF6g9108kbGyKdhxgJ5nPpc6m7</code><code>/sh</code>

<code>0WnJpwfqfa+bjkJzGKcTHpbmoU2dJGuS+tMCwWj3b6sAwJIGYgJXD5VLfmTBXdfI</code>

<code>uyDcqJhqQfoxw92gqSrH4GtbxC8RVImA7Ogmv57KNIMjAcPODwsPz+8pQwGOAE8E</code>

<code>eLAFnE79VzWeqc2Xi</code><code>/J6glAy9TTuOnRDhA1wP1XV60iNUzlOxRuzzZaPRlQR6yIb</code>

<code>CWuH6Lid5i6vNIzT1J1pQwYhf</code><code>/A/dZdtB8S5/B2cFNdzG</code><code>+0rtQWdFGmhq6mb8V3R</code>

<code>wEpaVwIsxDn6TYoFmSgr3FAWin6MA8jAcewG4UYAKYtBZ2zovj0erOcoNfzd8TC6</code>

<code>dNhid3dw9EnskeHPdJoE7pNGfAFKE5vCplG5</code><code>/ooM3Ex</code><code>+mYUiJRaf0w==</code>

   這個時候檢視passwd.openssl就不再是使用者資訊了,而是一堆加密過的序列。

   2)passwd.openssl的解密,解密為openssl.out

<code>[root@nmshuishui ~]</code><code># openssl enc -d -des3 -a -salt -in ./passwd.openssl -out passwd.out</code>

<code>enter des-ede3-cbc decryption password:</code>

<code>anaconda-ks.cfg  </code><code>install</code><code>.log  </code><code>install</code><code>.log.syslog  myiso  </code><code>passwd</code><code>.openssl  </code><code>passwd</code><code>.out  scripts  soft  tmp</code>

<code>[root@nmshuishui ~]</code><code># cat passwd.out</code>

<code>root:x:0:0:root:</code><code>/root</code><code>:</code><code>/bin/bash</code>

<code>bin:x:1:1:bin:</code><code>/bin</code><code>:</code><code>/sbin/nologin</code>

<code>daemon:x:2:2:daemon:</code><code>/sbin</code><code>:</code><code>/sbin/nologin</code>

<code>adm:x:3:4:adm:</code><code>/var/adm</code><code>:</code><code>/sbin/nologin</code>

<code>lp:x:4:7:lp:</code><code>/var/spool/lpd</code><code>:</code><code>/sbin/nologin</code>

<code>sync</code><code>:x:5:0:</code><code>sync</code><code>:</code><code>/sbin</code><code>:</code><code>/bin/sync</code>

<code>shutdown</code><code>:x:6:0:</code><code>shutdown</code><code>:</code><code>/sbin</code><code>:</code><code>/sbin/shutdown</code>

<code>halt:x:7:0:halt:</code><code>/sbin</code><code>:</code><code>/sbin/halt</code>

<code>mail:x:8:12:mail:</code><code>/var/spool/mail</code><code>:</code><code>/sbin/nologin</code>

<code>uucp:x:10:14:uucp:</code><code>/var/spool/uucp</code><code>:</code><code>/sbin/nologin</code>

<code>operator:x:11:0:operator:</code><code>/root</code><code>:</code><code>/sbin/nologin</code>

<code>games:x:12:100:games:</code><code>/usr/games</code><code>:</code><code>/sbin/nologin</code>

  解密後再檢視,就是原檔案的内容了。

五、使用openssl實作私有CA

1、自建CA

   要使用openssl建立麼有CA,首先還是看一下openssl的配置檔案中關于CA的描述吧。配置檔案在/etc/pki/tls/openssl.cnf,這裡面主要定義了證書的存放路徑、密鑰的存放路徑、和其它一些證書相關的說明。

<a href="http://s3.51cto.com/wyfs02/M01/22/51/wKiom1MbGTShbuWrAACFNxqhe-M142.png" target="_blank"></a>

   CA做為一個第三方的權威認證機構,專門是給别人發證的,要使别人信任它,需它自己有證,但現在它是一個根,是以他首先要自簽證書來證明自己的合法性,然後才能給别人頒發證書,而證書需要密鑰,是以首先要生成密鑰對兒。

   1)生成密鑰對兒

   公鑰是人人都可以用的,但是私鑰一定得自己儲存,不能讓别人檢視,是以當我們建立私鑰時,要讓其的權限為600,并放在子shell中去執行。這裡我們僅生成私鑰即可,不需生成公鑰,因為私鑰很長,公鑰是從私鑰中按某種格式提取出來的。

<code>[root@nmshuishui CA]</code><code># pwd</code>

<code>/etc/pki/CA</code>

<code>[root@nmshuishui CA]</code><code># ls</code>

<code>certs  crl  newcerts  private</code>

<code>[root@nmshuishui CA]</code><code># (umask 077;openssl genrsa -out private/cakey.pem 2048)</code>

<code>Generating RSA private key, 2048 bit long modulus</code>

<code>.............................................................+++</code>

<code>.....+++</code>

<code>e is 65537 (0x10001)</code>

<code>[root@nmshuishui CA]</code><code># ls -l private/cakey.pem</code>

<code>-rw-------. 1 root root 1679 Mar  8 11:07 private</code><code>/cakey</code><code>.pem</code>

<code>[root@nmshuishui CA]</code><code>#</code>

如果想要檢視公鑰可以使用-pubout把公鑰提取出來再用-text以文本格式顯示:openssl rsa -in private/cakey.pem -pubout -text(非必要步驟)

<a href="http://s3.51cto.com/wyfs02/M02/22/52/wKioL1MbK_bDBDdsAAB5z3RZa5s705.png" target="_blank"></a>

上圖中夾在BEGIN PUBLIC KEY和END PUBLIC KEY中間的就是公鑰資訊,再上面的一些就是私鑰資訊了。

   2)生成自簽證書

<a href="http://s3.51cto.com/wyfs02/M01/22/51/wKiom1MbSnbyY9vUAABc3r_O1C0024.png" target="_blank"></a>

3)建立需要的檔案

<code>[root@nmshuishui CA]</code><code># touch index.txt serial crlnumber</code>

<code>[root@nmshuishui CA]</code><code># echo 01 &gt; serial</code>

2、用openssl實作證書申請

   1)在主機上生成密鑰,儲存到應用此證書的服務的配置檔案目錄下 ,這裡應用伺服器是httpd。

<code>[root@localhost ~]</code><code># mkdir /etc/httpd/ssl</code>

<code>[root@localhost ~]</code><code># cd /etc/httpd/ssl/</code>

<code>[root@localhost ssl]</code><code># (umask 077;openssl genrsa -out httpd.key 1024)</code>

<code>Generating RSA private key, 1024 bit long modulus</code>

<code>..................++++++</code>

<code>.......++++++</code>

<code>[root@localhost ssl]</code><code>#</code>

2)生成證書簽署請求

<a href="http://s3.51cto.com/wyfs02/M02/22/51/wKiom1MbUeqAF6mQAABq-ID7dNo470.png" target="_blank"></a>

生成的.csr(cetificate signature request)是證書簽署請求。

   3)将請求檔案發送CA

<a href="http://s3.51cto.com/wyfs02/M02/22/51/wKiom1MbUuPBE7H3AAAs7ghnQZo333.png" target="_blank"></a>

3、CA簽署證書

   1)、簽署

<a href="http://s3.51cto.com/wyfs02/M02/22/52/wKioL1MbVEjQSq4OAACMkw_leA8744.png" target="_blank"></a>

 2)、将證書傳回請求者

<a href="http://s3.51cto.com/wyfs02/M01/22/52/wKioL1MbVSOgY9u3AAAwFQAV9V8117.png" target="_blank"></a>

3)、傳回用戶端驗證檢視

<a href="http://s3.51cto.com/wyfs02/M01/22/51/wKiom1MbVbqxLKo0AAALrTSY7sk144.png" target="_blank"></a>

4、吊銷證書

   吊銷後,會把吊銷的證書放到吊銷清單中。

<a href="http://s3.51cto.com/wyfs02/M02/22/51/wKiom1MbVpeTUFDCAAAhqM9Q1T8041.png" target="_blank"></a>

本文轉自 nmshuishui 51CTO部落格,原文連結:http://blog.51cto.com/nmshuishui/1370917,如需轉載請自行聯系原作者

繼續閱讀