資料加密算法通常可以分為三類:對稱加密;非對稱加密;單向加密。先對它們的差別與作用作說明
1、對稱加密算法
所謂對稱加密算法就是加密和解密使用同一個密鑰。其基本算法有DES、3DES、AES等。特性:加密、解密使用同一個密鑰;将原始資料分割成固定大小的塊,逐個進行加密。缺陷:密鑰過多;密鑰分發。
2、非對稱加密
密鑰是成對出現。實作算法有RSA, DSA, ELGama等。公鑰(pubkey):公開給所有人;私鑰(secret key):自己留存,必須保證其私密性。特點:用公鑰加密的資料,隻能使用與之配對兒的私鑰解密;反之亦然。其主要應用場景有:
數字簽名:主要在于讓接收方确認發送方身份;
密鑰交換:發送方用對方的公鑰加密一個對稱密鑰,并發送給對方;
資料加密:由于加密資料時間緩慢,一般不用來加密資料。
3、單向加密
其基本算法有:MD5,SHA1等。特點:隻能解密,不能解密;可用于提取資料指紋;定長輸出、雪崩效應(即資料内容的一丁點改變,可能造成輸出結果的巨大變化)。
二、openssl的使用
openssl是用于實作加密的工具。其内部內建了大多數加密算法的實作。現在對其基本用法做一個說明。
1、對稱資料加密
1
<code>使用des3算法,加密 </code><code>fdisk</code><code>.sh檔案資料,加密後的檔案資料存放入code.</code><code>file</code><code>中</code>
2
3
4
5
6
7
8
9
10
11
12
<code>[root@mylinux home]</code><code># openssl enc -des3 -a -salt -in fdisk.sh -out code.file;加密</code>
<code>enter des-ede3-cbc encryption password:</code>
<code>Verifying - enter des-ede3-cbc encryption password:</code>
<code>[root@mylinux home]</code><code># cat fdisk.sh </code>
<code>qeqweqeq</code>
<code>[root@mylinux home]</code><code># cat code.file </code>
<code>U2FsdGVkX1+JUB</code><code>/kio926cofroD0rRypfUcYmh</code><code>+eIho=</code>
<code>[root@mylinux home]</code><code># openssl enc -d -des3 -a -salt -in code.file -out fdisk2.sh;解密</code>
<code>enter des-ede3-cbc decryption password:</code>
<code>[root@mylinux home]</code><code># cat fdisk2.sh </code>
<code>[root@mylinux home]</code><code>#</code>
2、單向加密
<code>一般用于提取檔案的特征碼,檔案資料的微小改變會造成雪崩效應。</code>
<code>[root@mylinux home]</code><code># cat fdisk.sh qeqweqeq</code>
<code>[root@mylinux home]</code><code># openssl dgst -md5 fdisk.sh </code>
<code>MD5(</code><code>fdisk</code><code>.sh)= 44892aaa22ea31022cf8af4e0521e3ff</code>
<code>[root@mylinux home]</code><code># echo "qeqweqee" >fdisk.sh </code>
<code>[root@mylinux home]</code><code># cat fdisk.sh </code>
<code>qeqweqee</code>
<code>MD5(</code><code>fdisk</code><code>.sh)= bb123d0f209942acdb0d640c3e1c32f3</code>
3、非對稱加密
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<code>主要用于密鑰交換(對方的公鑰)、資料加密(對方的公鑰)、身份認證(自己的私鑰)</code>
<code>[root@mylinux home]</code><code># openssl genrsa -out rsa.key;生成私鑰</code>
<code>Generating RSA private key, 1024 bit long modulus</code>
<code>.....++++++</code>
<code>............................++++++</code>
<code>e is 65537 (0x10001)</code>
<code>[root@mylinux home]</code><code># cat rsa.key </code>
<code>-----BEGIN RSA PRIVATE KEY-----</code>
<code>MIICWwIBAAKBgQDPGeA1ir63tb4C8TkRUvEvoQkPMk2NE5389ErMtCB7t4Njif7A</code>
<code>VVTWn1zC</code><code>/WWHfwaWfRb4fNdMCyv0aLPRvMCfw8TKTd6thlD0WJ5nIYAWyOA4XN2A</code>
<code>Jz1o80</code><code>/iMMkdx1TBju5sjvvOPRYRVeBsta/x/hsDyo3F</code><code>+OSHSmgBqDVv3QIDAQAB</code>
<code>AoGAIRbKSuOzGxkPldrCunDdFjYNg38PAvZabLr</code><code>/ZHt3IS0t8e5vZH19w5jMsl7Y</code>
<code>JPD3tX2g+OzBXWX</code><code>/jNpZuK4GvHY2GMNRbI0cwQTtr5oNEBFCmdeO9gETVglcLmwN</code>
<code>SgDQSo1iK1mEEroL7n2D8pBxOqEdsXgyQAKoGT2miyQckwECQQD5BEnBzs3ddkH7</code>
<code>QjjOnxEpxE3MsLSCJqUWJ6eI</code><code>/ZuKCfxgiAWjHPKny/OA5F/Dr</code><code>+apSJB34BwS6g5l</code>
<code>ClThEIjBAkEA1Oir7tqOA1SkfFfwOyXRK</code><code>/C83XYgjbU2gp594hAPmRbCZu6DYxht</code>
<code>j+UOz0cB9VrLlfHmvzZG1d08AD10+HByHQJAMp5mh9kMC</code><code>/qgCv05Ivc</code><code>+u+jFj9hT</code>
<code>uSk14b0J11UGKxdAkDbWPoQB544T352MwfCdyMeRZmzOCCI</code><code>/7tYczutXgQJADoZd</code>
<code>DGt+mr2QhyccrXxT+9JtoBIqAGDnehvD7MM5vTDvTERjVERbXSC8VOm8OXfbQbyC</code>
<code>CHN0e6yfJkkLDNPnBQJAPP+G+T8PvVZlYOYjptCR+H7ofylVgkGK3eh</code><code>/6pwtyoxR</code>
<code>AJ3mTOQydIpLw3w1cOIDTNZOF8hXxRAJa7imJF74ew==</code>
<code>-----END RSA PRIVATE KEY-----</code>
<code>[root@mylinux home]</code><code># </code>
<code>[root@mylinux home]</code><code># openssl rsa -in rsa.key -pubout ;從私鑰中提取公鑰</code>
<code>writing RSA key</code>
<code>-----BEGIN PUBLIC KEY-----</code>
<code>MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDPGeA1ir63tb4C8TkRUvEvoQkP</code>
<code>Mk2NE5389ErMtCB7t4Njif7AVVTWn1zC</code><code>/WWHfwaWfRb4fNdMCyv0aLPRvMCfw8TK</code>
<code>Td6thlD0WJ5nIYAWyOA4XN2AJz1o80</code><code>/iMMkdx1TBju5sjvvOPRYRVeBsta/x/hsD</code>
<code>yo3F+OSHSmgBqDVv3QIDAQAB</code>
<code>-----END PUBLIC KEY-----</code>
三、遠端連接配接SSH服務
1、SSH遠端連接配接原理
SSH: Secure SHell,建立在應用層和傳輸層基礎上的安全協定。通信及認證過程是加密的。監聽tcp的22号端口,是文本協定。其主要工作原理如下圖所示:
<a href="http://s5.51cto.com/wyfs02/M02/86/EB/wKioL1fOvo-x_ir4AADvZhxfsYE407.png-wh_500x0-wm_3-wmp_4-s_1605916075.png" target="_blank"></a>
對于SSH服務協定通常使用的是sshv2版本。sshv2基于雙方主機協商選擇最安全的MAC實作機制;加密機制及MAC機制是雙方協商標明;基于DH實作密鑰交換,基于RSA或DSA實作身份認證;客戶通過檢查服務端的主機密鑰來判定是否與其進一步通信。
2、SSH的開源實作工具OpenSSH
配置檔案/etc/ssh/ssh_config
ssh認證機制:基于密碼、基于秘鑰。
ssh [-p PORT]USERNAME@HOST (登入遠端主機)
ssh -l USERNAME HOST
ssh USERNAME@HOST 'COMMAND' (不登入遠端主機,操作遠端主機)
scp: 類cp指令,基于ssh協定跨主機複制
scp USERNAME@HOST:/path/to/somefile /path/to/local(遠端複制到本地)
scp /path/to/local USERNAME@HOST:/path/to/somewhere(複制到遠端主機)
-r: 源檔案為目錄時使用,以實作遞歸複制; -p: 保留源檔案的複制及修改時間戳,以及權限;
-q: 靜默模式-P PORT:指定服務端端口;
3、基于秘鑰的免密通信
<code>[root@mylinux home]</code><code># ssh 192.168.1.108</code>
<code>The authenticity of host </code><code>'192.168.1.108 (192.168.1.108)'</code> <code>can't be established.</code>
<code>RSA key fingerprint is 6b:d7:f0:61:fe:b9:b7:2c:93:f5:5b:be:80:49:77:7d.</code>
<code>Are you sure you want to </code><code>continue</code> <code>connecting (</code><code>yes</code><code>/no</code><code>)? </code><code>yes</code>
<code>Warning: Permanently added </code><code>'192.168.1.108'</code> <code>(RSA) to the list of known hosts.</code>
<code>[email protected]'s password: </code>
<code>Last login: Tue Sep 6 21:13:57 2016 from 192.168.1.5</code>
<code>[root@lamp01 ~]</code><code># ifconfig </code>
<code>eth0 Link encap:Ethernet HWaddr 00:0C:29:8B:8C:FE </code>
<code> </code><code>inet addr:192.168.1.108 Bcast:192.168.1.255 Mask:255.255.255.0</code>
<code> </code><code>inet6 addr: fe80::20c:29ff:fe8b:8cfe</code><code>/64</code> <code>Scope:Link</code>
<code> </code><code>UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1</code>
<code> </code><code>RX packets:4372 errors:0 dropped:0 overruns:0 frame:0</code>
<code> </code><code>TX packets:2446 errors:0 dropped:0 overruns:0 carrier:0</code>
<code> </code><code>collisions:0 txqueuelen:1000 </code>
<code> </code><code>RX bytes:5094407 (4.8 MiB) TX bytes:166449 (162.5 KiB)</code>
<code> </code><code>Interrupt:19 Base address:0x2000 </code>
<code>lo Link encap:Local Loopback </code>
<code> </code><code>inet addr:127.0.0.1 Mask:255.0.0.0</code>
<code> </code><code>inet6 addr: ::1</code><code>/128</code> <code>Scope:Host</code>
<code> </code><code>UP LOOPBACK RUNNING MTU:16436 Metric:1</code>
<code> </code><code>RX packets:38 errors:0 dropped:0 overruns:0 frame:0</code>
<code> </code><code>TX packets:38 errors:0 dropped:0 overruns:0 carrier:0</code>
<code> </code><code>collisions:0 txqueuelen:0 </code>
<code> </code><code>RX bytes:3344 (3.2 KiB) TX bytes:3344 (3.2 KiB)</code>
通常我們使用ssh登入遠端主機的時候是要密碼的,當我們想要免密登入對方的主機時,這時就要用到基于秘鑰得認證機制。使用方法也十分簡單,隻需要兩步:
1、用戶端本地生成一對秘鑰
2、将公鑰傳輸至遠端伺服器,追加儲存到遠端主機某使用者的家目錄 的.ssh/authorized_keys檔案或.ssh/authorized_keys2檔案中。
在這裡我使用192.168.1.106位用戶端。192.168.1.108作為遠端伺服器。
32
33
34
<code>[root@mylinux home]</code><code># ssh-keygen -t rsa ;生成一對秘鑰</code>
<code>Generating public</code><code>/private</code> <code>rsa key pair.</code>
<code>Enter </code><code>file</code> <code>in</code> <code>which</code> <code>to save the key (</code><code>/root/</code><code>.</code><code>ssh</code><code>/id_rsa</code><code>): </code>
<code>Enter passphrase (empty </code><code>for</code> <code>no passphrase): </code>
<code>Enter same passphrase again: </code>
<code>Your identification has been saved </code><code>in</code> <code>/root/</code><code>.</code><code>ssh</code><code>/id_rsa</code><code>.</code>
<code>Your public key has been saved </code><code>in</code> <code>/root/</code><code>.</code><code>ssh</code><code>/id_rsa</code><code>.pub.</code>
<code>The key fingerprint is:</code>
<code>e9:ae:a4:2c:bd:68:64:6a:ae:a4:81:20:39:9f:ac:2f root@mylinux</code>
<code>The key's randomart image is:</code>
<code>+--[ RSA 2048]----+</code>
<code>| |</code>
<code>| . . |</code>
<code>|= S |</code>
<code>|++o. . |</code>
<code>|o=+. . . |</code>
<code>|E+oo.o . |</code>
<code>|B=o.+.... |</code>
<code>+-----------------+</code>
<code>[root@mylinux home]</code><code># cd ~/.ssh/</code>
<code>[root@mylinux .</code><code>ssh</code><code>]</code><code># ls</code>
<code>id_rsa id_rsa.pub known_hosts</code>
<code>[root@mylinux .</code><code>ssh</code><code>]</code><code># ssh-copy-id -i id_rsa.pub [email protected] ;将公鑰傳送至遠端伺服器</code>
<code>Now try logging into the machine, with </code><code>"ssh '[email protected]'"</code><code>, and check </code><code>in</code><code>:</code>
<code> </code><code>.</code><code>ssh</code><code>/authorized_keys</code>
<code>to </code><code>make</code> <code>sure we haven</code><code>'t added extra keys that you weren'</code><code>t expecting.</code>
<code>[root@mylinux .</code><code>ssh</code><code>]</code><code># ssh [email protected] ;免密登入成功</code>
<code>Last login: Tue Sep 6 21:18:21 2016 from 192.168.1.106</code>
<code>[root@lamp01 ~]</code><code>#</code>
本文轉自 夢想成大牛 51CTO部落格,原文連結:http://blog.51cto.com/yinsuifeng/1847001,如需轉載請自行聯系原作者