1、對(duì)稱(chēng)加密算法
對(duì)稱(chēng)加密:加密和解密使用同一個(gè)密鑰谷丸。
DES:Data Encryption Standard踪栋,56bits
3DES:
AES:Advanced (128, 192, 256bits)
Blowfish,Twofish
IDEA渔扎,RC6志鹃,CAST5
data---加密key1(data)=data'----解密key2(data')=data
如果key1=key2夭问,稱(chēng)為對(duì)稱(chēng)加密
如果key1!=key2曹铃,稱(chēng)為非對(duì)稱(chēng)加密
特性:
1缰趋、加密、解密使用同一個(gè)密鑰,效率高埠胖。1G的數(shù)據(jù)用DES加密后變成2G,加密需要4分鐘淳玩,解密需要8分鐘直撤,一共12分鐘。
2蜕着、將原始數(shù)據(jù)分割成固定大小的塊谋竖,逐個(gè)進(jìn)行加密。
缺陷:
1承匣、密鑰過(guò)多蓖乘。
2、密鑰分發(fā)時(shí)不安全韧骗,因?yàn)橛猛话谚€匙嘉抒,怎么將鑰匙傳給對(duì)方才算安全,如果傳遞時(shí)被黑客截獲鑰匙和加密數(shù)據(jù)袍暴,就可以打開(kāi)加密的數(shù)據(jù)些侍,除非人送過(guò)去,但人送過(guò)去還不如直接把數(shù)據(jù)帶過(guò)去了政模。
3岗宣、數(shù)據(jù)來(lái)源無(wú)法確認(rèn)。
示例
[root@redhat7 app]#gpg -c bak.sh ---加密bak.sh文件淋样,會(huì)出現(xiàn)一個(gè)
框讓輸入密碼耗式,輸入兩遍密碼后就會(huì)把文件加密,這個(gè)密碼就相當(dāng)于
對(duì)稱(chēng)秘鑰趁猴,對(duì)方要想解密刊咳,也得需要這個(gè)秘鑰才能解密
[root@redhat7 app]#ls ---生成一個(gè)bak.sh.gpg文件,這個(gè)文件就是加密的文件
bak.sh dos.sh f1.txt fun.awk scp.sh ssh1.exp
bak.sh.gpg f1 f2 reset.sh script website
[root@redhat7 app]#scp bak.sh.gpg 172.18.21.6:/app ---將這個(gè)加密的文件傳給centos6
root@172.18.21.6's password:
bak.sh.gpg 100% 79 107.1KB/s 00
[root@centos6 app]#gpg -d bak.sh.gpg --- -d選項(xiàng)用于解密文件儡司,要輸入秘鑰才能解密芦缰,只會(huì)在屏幕上輸出
gpg: directory `/root/.gnupg' created
gpg: new configuration file `/root/.gnupg/gpg.conf' created
gpg: WARNING: options in `/root/.gnupg/gpg.conf' are not yet active durs run
gpg: keyring `/root/.gnupg/secring.gpg' created
gpg: keyring `/root/.gnupg/pubring.gpg' created
gpg: CAST5 encrypted data
can't connect to `/root/.gnupg/S.gpg-agent': No such file or directory
gpg-agent[8859]: directory `/root/.gnupg/private-keys-v1.d' created ┌─────────────────────────────────────────────────────┐
│ Enter passphrase │
│ │
│ │
│ Passphrase ******__________________________________ │
│ │
│ <OK> <Cancel> │
└─────────────────────────────────────────────────────┘
gpg: encrypted with 1 passphrase
cp -a /etc/ /app/`date "+%F-%T"`/ ---解密后顯示的文件內(nèi)容
gpg: WARNING: message was not integrity protected
[root@centos6 app]#gpg -o bak.sh -d bak.sh.gpg ---為了讓解密后的內(nèi)容保存到文件中,使用-o選項(xiàng)枫慷,這里-o選項(xiàng)必須在前面让蕾。
gpg: CAST5 encrypted data
can't connect to `/root/.gnupg/S.gpg-agent': No such file or directory ┌─────────────────────────────────────────────────────┐
│ Enter passphrase │
│ │
│ │
│ Passphrase ******__________________________________ │
│ │
│ <OK> <Cancel> │
└─────────────────────────────────────────────────────┘
gpg: encrypted with 1 passphrase
gpg: WARNING: message was not integrity protected
[root@centos6 app]#cat bak.sh ---查看文件內(nèi)容
cp -a /etc/ /app/`date "+%F-%T"`/
2、非對(duì)稱(chēng)加密算法
非對(duì)稱(chēng)加密:密鑰是成對(duì)出現(xiàn)
公鑰:公開(kāi)給所有人或听;public key
私鑰:自己留存探孝,必須保證其私密性;secret key
特點(diǎn):用公鑰加密數(shù)據(jù)誉裆,只能使用與之配對(duì)的私鑰解密顿颅;反之亦然
功能:
數(shù)字簽名:主要在于讓接收方確認(rèn)發(fā)送方身份,比如用發(fā)送方的私鑰加密的數(shù)據(jù)足丢,只有用發(fā)送方的公鑰才能解密粱腻,如果能解開(kāi)庇配,說(shuō)明是發(fā)送方發(fā)的數(shù)據(jù),相當(dāng)于發(fā)送方在數(shù)據(jù)里打了個(gè)標(biāo)簽绍些,證明這個(gè)數(shù)據(jù)是我發(fā)送的數(shù)據(jù)捞慌,你必須用我給你的公鑰才能解密數(shù)據(jù)。
比如a--->b發(fā)數(shù)據(jù)
a有兩把鑰匙:pa柬批、sa
b有兩把鑰匙:pb啸澡、sb
data--->加密sa(data)=data'---->解密pa(data')=data
a用自己私鑰加密的數(shù)據(jù),b只有拿到a的公鑰才能解開(kāi)氮帐。
對(duì)稱(chēng)密鑰交換:發(fā)送方a用對(duì)方b的公鑰加密一個(gè)對(duì)稱(chēng)密鑰后發(fā)送給對(duì)方b嗅虏,對(duì)方b用自己的私鑰解開(kāi)后,就可以得到對(duì)稱(chēng)秘鑰上沐,保證對(duì)稱(chēng)秘鑰傳輸?shù)陌踩浴?br> a發(fā)送pb(key)--->b ,b用自己的sb解開(kāi)就可以得到key
數(shù)據(jù)加密:適合加密較小數(shù)據(jù)
缺點(diǎn):密鑰長(zhǎng)皮服,加密解密效率低下,比如用RSA非對(duì)稱(chēng)加密算法加密后参咙,1G的數(shù)據(jù)冰更,加密后還是1G,加密時(shí)間1分鐘,解密時(shí)間需要64小時(shí)昂勒,效率極低
算法:
RSA(加密蜀细,數(shù)字簽名),DSA(數(shù)字簽名),ELGamal
常見(jiàn)的加密方式
a有兩把鑰匙:pa、sa
b有兩把鑰匙:pb戈盈、sb
hash(data):表示取數(shù)據(jù)的哈希值
pb[sa(data)] ---a用a的私鑰加密數(shù)據(jù)后奠衔,再用b的公鑰加密,然后傳
給b塘娶,這樣就可以保證數(shù)據(jù)是a的归斤,因?yàn)槟惚仨毮玫絘的公鑰才能解密
數(shù)據(jù)。
pb{data+sa[hash(data)]} ---a將數(shù)據(jù)哈希值用a的私鑰加密刁岸,實(shí)現(xiàn)數(shù)
字簽名脏里,然后再將數(shù)據(jù)和數(shù)據(jù)的哈希值用b的公鑰加密,傳給b虹曙,b收
到數(shù)據(jù)后用自己的私鑰解密迫横,然后再用a的公鑰解密哈希值,再將
data取哈希值酝碳,看看兩個(gè)哈希值是否一樣矾踱,就可以判斷傳輸?shù)倪^(guò)程中
數(shù)據(jù)有沒(méi)有損壞
key{data+sa[hash(data)]}+pb(key) ---表示a用自己的私鑰加密哈希
值,然后用對(duì)稱(chēng)秘鑰加密數(shù)據(jù)疏哗,再用b的公鑰加密對(duì)稱(chēng)秘鑰呛讲,這種方
式可以提高效率,因?yàn)楣V当葦?shù)據(jù)少很多,用非對(duì)稱(chēng)加密時(shí)速度就
快贝搁,用對(duì)稱(chēng)加密數(shù)據(jù)速度也快吗氏,并且用非對(duì)稱(chēng)加密對(duì)稱(chēng)秘鑰的鑰匙也
比較快。
3雷逆、用哈希值檢查文件的數(shù)據(jù)是否被破壞
數(shù)據(jù)相同弦讽,哈希值必相同,數(shù)據(jù)不同关面,哈希值必不同坦袍,例如/etc/shadow文件十厢,修改密碼的時(shí)候這個(gè)文件中的內(nèi)容會(huì)發(fā)生改變等太,第二列的密碼處會(huì)改變,即使修改的密碼和原來(lái)是一樣的蛮放,第二列也會(huì)發(fā)生變化缩抡,哈希值就會(huì)不同。哈希值就是利用不同的加密算法對(duì)文件進(jìn)行哈希運(yùn)算包颁,文件內(nèi)容相同瞻想,算法相同,哈希值必相同娩嚼,哈希值也被稱(chēng)為摘要蘑险。
取文件的哈希值
[root@redhat7 app]#md5sum f1
b961a0c24aae5dbdd45c616698aa2583 f1
[root@redhat7 app]#sha1sum f1
af3a88aa357037a2c10a5b36bcaecc790e058d50 f1
[root@redhat7 app]#sha512sum f1
899263275ec8aab505102b9c58032e4dba758bf4cfca3da7fc5916f7e895cd31bc57ac99e9883287a41fdeaaed0664a45e90ad4050c168e0baea240355616459 f1
用不同的算法取出來(lái)的哈希值不同,取出來(lái)的哈希值是個(gè)16進(jìn)制岳悟,1個(gè)16進(jìn)制代表4個(gè)2進(jìn)制佃迄。
常見(jiàn)算法:md5: 128bits、sha1: 160bits贵少、sha224:224bits
sha256:256bits呵俏、sha384:384bits、sha512:512bits
[root@redhat7 app]#sha512sum f1 >f1.sha512 ---將文件的哈希值保存到一個(gè)文件中
[root@redhat7 app]#sha512sum --check f1.sha512 ---檢查文件的哈
希值是否發(fā)生改變滔灶,ok就是沒(méi)有改變普碎,說(shuō)明文件沒(méi)有破壞
f1: OK
[root@redhat7 app]#echo >> f1 ---在里面加一個(gè)空格
[root@redhat7 app]#sha512sum --check f1.sha512 ---發(fā)現(xiàn)失敗了,說(shuō)明文件遭到了破壞
f1: FAILED
sha512sum: WARNING: 1 computed checksum did NOT match
[root@redhat7 app]#find /etc/sysconfig/ -type f -exec sha512sum {} \; >/app/all.log ---也可以一次就得出多個(gè)文件的哈希值
录平,并將其保存到文件中麻车。
[root@redhat7 app]#sha512sum --check all.log ---一次檢查多個(gè)文件的哈希值,看看有沒(méi)有什么變化斗这。
/etc/sysconfig/ip6tables-config: OK
/etc/sysconfig/iptables-config: OK
/etc/sysconfig/cbq/avpkt: OK
/etc/sysconfig/cbq/cbq-0000.example: OK
4绪氛、rpm檢查文件完整性的兩種實(shí)施方式
- 被安裝的文件
[root@redhat7 app]#rpm -ql tree ---tree包安裝后生成的文件
/usr/bin/tree
/usr/share/doc/tree-1.6.0
/usr/share/doc/tree-1.6.0/LICENSE
/usr/share/doc/tree-1.6.0/README
/usr/share/man/man1/tree.1.gz
[root@redhat7 app]#rpm -V tree ---檢查文件的屬性和哈希值等是否發(fā)生改變,發(fā)現(xiàn)沒(méi)有發(fā)生改變
[root@redhat7 app]#echo >> /usr/share/doc/tree-1.6.0/LICENSE
---加一個(gè)空格在一個(gè)文件中
[root@redhat7 app]#rpm -V tree ---再檢查涝影,發(fā)現(xiàn)文件的屬性和哈希值等發(fā)生了變化
S.5....T. d /usr/share/doc/tree-1.6.0/LICENSE
rpm安裝tree包時(shí)枣察,會(huì)把每個(gè)文件的屬性以及哈希值等保存到rpm數(shù)據(jù)庫(kù)中,用rpm -V 進(jìn)行檢查時(shí),就是將數(shù)據(jù)庫(kù)中文件屬性以及哈希值等和目前的文件進(jìn)行比對(duì)序目,看是否有變化臂痕。
- 檢查發(fā)行的軟件包文件
[root@centos6 app]#rpm -K /misc/cd/Packages/tree-1.5.3-3.el6.x86_64.rpm
/misc/cd/Packages/tree-1.5.3-3.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
可以檢查軟件包文件的完整性和簽名,是在導(dǎo)入公鑰的前提下猿涨。
5握童、使用gpg工具實(shí)現(xiàn)公鑰加密
centos6端進(jìn)行的操作
[root@centos6 app]#gpg --list-key ---查看公鑰
gpg: /root/.gnupg/trustdb.gpg: trustdb created
[root@centos6 app]#ll /root/.gnupg/
total 16
-rw-------. 1 root root 7856 Sep 8 07:52 gpg.conf
drwx------. 2 root root 4096 Sep 8 07:52 private-keys-v1.d
-rw-------. 1 root root 0 Sep 8 07:52 pubring.gpg ---存放公鑰的文
件,大小都是0
-rw-------. 1 root root 0 Sep 8 07:52 secring.gpg ---存放私鑰的文
件叛赚,大小是0澡绩,說(shuō)明公鑰和私鑰還沒(méi)有
-rw-------. 1 root root 40 Sep 8 12:11 trustdb.gpg
[root@centos6 app]#gpg --gen-key ---生成公鑰和私鑰
[root@centos6 app]#ll /root/.gnupg/
total 32
-rw-------. 1 root root 7856 Sep 8 07:52 gpg.conf
drwx------. 2 root root 4096 Sep 8 07:52 private-keys-v1.d
-rw-------. 1 root root 650 Sep 8 12:21 pubring.gpg
存放公鑰的文件大小已經(jīng)發(fā)生變化
-rw-------. 1 root root 650 Sep 8 12:21 pubring.gpg~
-rw-------. 1 root root 600 Sep 8 12:21 random_seed
-rw-------. 1 root root 1313 Sep 8 12:21 secring.gpg
存放私鑰的文件也是發(fā)生變化
-rw-------. 1 root root 1280 Sep 8 12:21 trustdb.gpg
[root@centos6 app]#gpg --list-key ---查看一下,發(fā)現(xiàn)公鑰已經(jīng)生成
/root/.gnupg/pubring.gpg
------------------------
pub 1024R/84BCC1E9 2017-09-08
uid centos6 ---公鑰和私鑰
sub 1024R/8DC5A90D 2017-09-08
[root@centos6 app]#gpg --list-secret-key ---查看私鑰也已經(jīng)生成
/root/.gnupg/secring.gpg
------------------------
sec 1024R/84BCC1E9 2017-09-08
uid centos6
ssb 1024R/8DC5A90D 2017-09-08
[root@centos6 app]#gpg -a --export -o centos6.pubkey ---導(dǎo)出公鑰到一個(gè)文件中
[root@centos6 app]#scp centos6.pubkey 172.18.21.7:/app
root@172.18.21.7's password:
centos6.pubkey 100% 984 1.0KB/s 00:00
把公鑰文件傳給centos7
在centos7中進(jìn)行的操作
[root@redhat7 app]#gpg --gen-key ---生成公鑰和私鑰
[root@redhat7 app]#gpg --list-key
/root/.gnupg/pubring.gpg
------------------------
pub 1024R/E046B6B6 2017-09-08
uid centos7
sub 1024R/A0F81BB8 2017-09-08
[root@redhat7 app]#gpg --list-secret-key
/root/.gnupg/secring.gpg
------------------------
sec 1024R/E046B6B6 2017-09-08
uid centos7
ssb 1024R/A0F81BB8 2017-09-08
發(fā)現(xiàn)公鑰和私鑰都已經(jīng)生成
[root@redhat7 app]#gpg --import /app/centos6.pubkey ---將centos6的公鑰導(dǎo)入centos7中
gpg: key 84BCC1E9: public key "centos6" imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)
[root@redhat7 app]#gpg --list-key ---發(fā)現(xiàn)導(dǎo)入成功
/root/.gnupg/pubring.gpg
------------------------
pub 1024R/E046B6B6 2017-09-08
uid centos7
sub 1024R/A0F81BB8 2017-09-08
pub 1024R/84BCC1E9 2017-09-08
uid centos6
sub 1024R/8DC5A90D 2017-09-08
[root@redhat7 app]#gpg -e -r centos6 bak.sh ---用centos6的公鑰加密bak.sh這個(gè)文件
gpg: 8DC5A90D: There is no assurance this key belongs to the named user
pub 1024R/8DC5A90D 2017-09-08 centos6
Primary key fingerprint: 0DE9 D72A 9C65 492F 750B 5E80 31B5 FB3D 84BC C1E9
Subkey fingerprint: 624D 280C B6FF 0BE7 79AA 4CE3 D153 F605 8DC5 A90D
It is NOT certain that the key belongs to the person named
in the user ID. If you *really* know what you are doing,
you may answer the next question with yes.
Use this key anyway? (y/N) y
[root@redhat7 app]#scp bak.sh.gpg 172.18.21.6:/app
root@172.18.21.6's password:
bak.sh.gpg 100% 243 358.3KB/s 00:00
把這個(gè)文件傳給centos6
在centos6中進(jìn)行的操作
[root@centos6 app]#gpg -o bak.log -d bak.sh.gpg ---解密這個(gè)文件俺附,我們發(fā)現(xiàn)自動(dòng)就是用自己的私鑰解密
gpg: encrypted with 1024-bit RSA key, ID 8DC5A90D, created 2017-09-08
"centos6"
[root@centos6 app]#cat bak.log --可以看到這個(gè)文件的內(nèi)容了
cp -a /etc/ /app/`date "+%F-%T"`/
[root@centos6 app]#gpg --delete-secret-keys centos6 ---刪除私鑰
[root@centos6 app]#gpg --delete-keys centos6 ---刪除公鑰肥卡,必須先刪除私鑰,才能刪除公鑰
[root@centos6 app]#ll /root/.gnupg/
total 24
-rw-------. 1 root root 7856 Sep 8 07:52 gpg.conf
drwx------. 2 root root 4096 Sep 8 07:52 private-keys-v1.d
-rw-------. 1 root root 0 Sep 8 15:52 pubring.gpg
-rw-------. 1 root root 650 Sep 8 12:21 pubring.gpg~
-rw-------. 1 root root 600 Sep 8 15:48 random_seed
-rw-------. 1 root root 0 Sep 8 15:52 secring.gpg
-rw-------. 1 root root 1280 Sep 8 15:52 trustdb.gpg
總結(jié):在生成公鑰和私鑰時(shí)事镣,需要一些時(shí)間步鉴,并要不斷的移動(dòng)鼠標(biāo),或者敲鍵盤(pán)才能生成璃哟,建議實(shí)驗(yàn)的時(shí)候選擇1024大小氛琢,避免浪費(fèi)時(shí)間。刪除公鑰時(shí)要注意随闪,要先刪除自己的私鑰才能刪除公鑰阳似。
6、CA和證書(shū)
如果a要想給b傳數(shù)據(jù)铐伴,使用b的公鑰去加密撮奏,怎么才能保證得到的公鑰是b的呢?這就需要一個(gè)第三方的權(quán)威機(jī)構(gòu)盛杰,稱(chēng)為CA認(rèn)證機(jī)構(gòu)挽荡,頒發(fā)證書(shū)給b,b首先將自己的公鑰pb傳給CA即供,CA進(jìn)行的操作是頒發(fā)證書(shū):sca(pb)+CA+算法+有效期等定拟,首先用自己的私鑰去加密b的公鑰,相當(dāng)于數(shù)字簽名逗嫡,并將證書(shū)和算法有效期等一起傳給b青自,b再將這證書(shū)傳給a,a因?yàn)檎J(rèn)可這個(gè)機(jī)構(gòu)驱证,所以a有CA的公鑰延窜,就可以解密這個(gè)證書(shū),得到b的公鑰抹锄。一般CA還會(huì)有上級(jí)CA逆瑞,稱(chēng)為根CA荠藤,他的下一級(jí)CA稱(chēng)為子CA,根CA給子CA頒發(fā)證書(shū)获高,子CA再給b頒發(fā)證書(shū)哈肖,根CA是用來(lái)給子CA證明合法性的,根CA誰(shuí)來(lái)證明呢念秧,只有自己證明自己淤井,自己簽名自己的公鑰,也就是b得到的證書(shū)是srootca(psubca)+ssubca(pb),根ca用自己的私鑰簽名子ca的公鑰摊趾,然后把證書(shū)傳給子ca币狠,子ca用自己的私鑰簽名b的公鑰,a得到這個(gè)證書(shū)后砾层,因?yàn)檎J(rèn)可根ca漩绵,所以有根ca的公鑰,就解密子ca的公鑰梢为,得到子ca的公鑰后渐行,就可以解密b的公鑰轰坊,得到b的公鑰了铸董。
PKI: Public Key Infrastructure
簽證機(jī)構(gòu):CA(Certificate Authority)
注冊(cè)機(jī)構(gòu):RA
證書(shū)吊銷(xiāo)列表:CRL
證書(shū)存取庫(kù):
X.509:定義了證書(shū)的結(jié)構(gòu)以及認(rèn)證協(xié)議標(biāo)準(zhǔn)
版本號(hào) 序列號(hào) 簽名算法 頒發(fā)者 有效期限 主體名稱(chēng) 主體公鑰
CRL分發(fā)點(diǎn) 擴(kuò)展信息 發(fā)行者簽名
證書(shū)類(lèi)型:
證書(shū)授權(quán)機(jī)構(gòu)的證書(shū)
服務(wù)器
用戶(hù)證書(shū)
獲取證書(shū)兩種方法:
?使用證書(shū)授權(quán)機(jī)構(gòu)
生成簽名請(qǐng)求(csr)
將csr發(fā)送給CA
從CA處接收簽名
?自簽名的證書(shū)
自已簽發(fā)自己的公鑰