2018-05-16 安全和加密 1

1、对称加密算法

对称加密:加密和解密使用同一个密钥。
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,称为对称加密
如果key1!=key2,称为非对称加密
特性:
1、加密、解密使用同一个密钥,效率高。1G的数据用DES加密后变成2G,加密需要4分钟,解密需要8分钟,一共12分钟。
2、将原始数据分割成固定大小的块,逐个进行加密。
缺陷:
1、密钥过多。
2、密钥分发时不安全,因为用同一把钥匙,怎么将钥匙传给对方才算安全,如果传递时被黑客截获钥匙和加密数据,就可以打开加密的数据,除非人送过去,但人送过去还不如直接把数据带过去了。
3、数据来源无法确认。

示例

[root@redhat7 app]#gpg -c bak.sh ---加密bak.sh文件,会出现一个
框让输入密码,输入两遍密码后就会把文件加密,这个密码就相当于
对称秘钥,对方要想解密,也得需要这个秘钥才能解密
[root@redhat7 app]#ls    ---生成一个bak.sh.gpg文件,这个文件就是加密的文件
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  ---将这个加密的文件传给centos6
[email protected]'s password: 
bak.sh.gpg                                  100%   79   107.1KB/s   00
[root@centos6 app]#gpg -d bak.sh.gpg --- -d选项用于解密文件,要输入秘钥才能解密,只会在屏幕上输出
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 ******__________________________________ │
           │                                                     │
           │                                         │
           └─────────────────────────────────────────────────────┘
gpg: encrypted with 1 passphrase
cp -a /etc/ /app/`date "+%F-%T"`/     ---解密后显示的文件内容
gpg: WARNING: message was not integrity protected
[root@centos6 app]#gpg -o bak.sh -d bak.sh.gpg ---为了让解密后的内容保存到文件中,使用-o选项,这里-o选项必须在前面。
gpg: CAST5 encrypted data
can't connect to `/root/.gnupg/S.gpg-agent': No such file or directory    ┌─────────────────────────────────────────────────────┐
           │ Enter passphrase                                    │
           │                                                     │
           │                                                     │
           │ Passphrase ******__________________________________ │
           │                                                     │
           │                                         │
           └─────────────────────────────────────────────────────┘
gpg: encrypted with 1 passphrase
gpg: WARNING: message was not integrity protected
[root@centos6 app]#cat bak.sh   ---查看文件内容
cp -a /etc/ /app/`date "+%F-%T"`/

2、非对称加密算法

非对称加密:密钥是成对出现
公钥:公开给所有人;public key
私钥:自己留存,必须保证其私密性;secret key
特点:用公钥加密数据,只能使用与之配对的私钥解密;反之亦然
功能:
数字签名:主要在于让接收方确认发送方身份,比如用发送方的私钥加密的数据,只有用发送方的公钥才能解密,如果能解开,说明是发送方发的数据,相当于发送方在数据里打了个标签,证明这个数据是我发送的数据,你必须用我给你的公钥才能解密数据。
比如a--->b发数据
a有两把钥匙:pa、sa
b有两把钥匙:pb、sb
data--->加密sa(data)=data'---->解密pa(data')=data
a用自己私钥加密的数据,b只有拿到a的公钥才能解开。
对称密钥交换:发送方a用对方b的公钥加密一个对称密钥后发送给对方b,对方b用自己的私钥解开后,就可以得到对称秘钥,保证对称秘钥传输的安全性。
a发送pb(key)--->b ,b用自己的sb解开就可以得到key
数据加密:适合加密较小数据
缺点:密钥长,加密解密效率低下,比如用RSA非对称加密算法加密后,1G的数据,加密后还是1G,加密时间1分钟,解密时间需要64小时,效率极低
算法:
RSA(加密,数字签名),DSA(数字签名),ELGamal

常见的加密方式

a有两把钥匙:pa、sa
b有两把钥匙:pb、sb
hash(data):表示取数据的哈希值
 pb[sa(data)]   ---a用a的私钥加密数据后,再用b的公钥加密,然后传
给b,这样就可以保证数据是a的,因为你必须拿到a的公钥才能解密
数据。
pb{data+sa[hash(data)]}   ---a将数据哈希值用a的私钥加密,实现数
字签名,然后再将数据和数据的哈希值用b的公钥加密,传给b,b收
到数据后用自己的私钥解密,然后再用a的公钥解密哈希值,再将
data取哈希值,看看两个哈希值是否一样,就可以判断传输的过程中
数据有没有损坏
key{data+sa[hash(data)]}+pb(key)   ---表示a用自己的私钥加密哈希
值,然后用对称秘钥加密数据,再用b的公钥加密对称秘钥,这种方
式可以提高效率,因为哈希值比数据少很多,用非对称加密时速度就
快,用对称加密数据速度也快,并且用非对称加密对称秘钥的钥匙也
比较快。

3、用哈希值检查文件的数据是否被破坏

数据相同,哈希值必相同,数据不同,哈希值必不同,例如/etc/shadow文件,修改密码的时候这个文件中的内容会发生改变,第二列的密码处会改变,即使修改的密码和原来是一样的,第二列也会发生变化,哈希值就会不同。哈希值就是利用不同的加密算法对文件进行哈希运算,文件内容相同,算法相同,哈希值必相同,哈希值也被称为摘要。

取文件的哈希值
[root@redhat7 app]#md5sum f1
b961a0c24aae5dbdd45c616698aa2583  f1
[root@redhat7 app]#sha1sum f1
af3a88aa357037a2c10a5b36bcaecc790e058d50  f1
[root@redhat7 app]#sha512sum f1
899263275ec8aab505102b9c58032e4dba758bf4cfca3da7fc5916f7e895cd31bc57ac99e9883287a41fdeaaed0664a45e90ad4050c168e0baea240355616459  f1
用不同的算法取出来的哈希值不同,取出来的哈希值是个16进制,1个16进制代表4个2进制。
常见算法:md5: 128bits、sha1: 160bits、sha224:224bits
sha256:256bits、sha384:384bits、sha512:512bits
[root@redhat7 app]#sha512sum f1 >f1.sha512  ---将文件的哈希值保存到一个文件中
[root@redhat7 app]#sha512sum --check f1.sha512 ---检查文件的哈
希值是否发生改变,ok就是没有改变,说明文件没有破坏
f1: OK
[root@redhat7 app]#echo >> f1  ---在里面加一个空格
[root@redhat7 app]#sha512sum --check f1.sha512 ---发现失败了,说明文件遭到了破坏
f1: FAILED
sha512sum: WARNING: 1 computed checksum did NOT match
[root@redhat7 app]#find /etc/sysconfig/ -type f -exec sha512sum {} \; >/app/all.log   ---也可以一次就得出多个文件的哈希值
,并将其保存到文件中。
[root@redhat7 app]#sha512sum --check all.log ---一次检查多个文件的哈希值,看看有没有什么变化。
/etc/sysconfig/ip6tables-config: OK
/etc/sysconfig/iptables-config: OK
/etc/sysconfig/cbq/avpkt: OK
/etc/sysconfig/cbq/cbq-0000.example: OK

4、rpm检查文件完整性的两种实施方式

  • 被安装的文件
[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   ---检查文件的属性和哈希值等是否发生改变,发现没有发生改变
[root@redhat7 app]#echo >> /usr/share/doc/tree-1.6.0/LICENSE 
---加一个空格在一个文件中
[root@redhat7 app]#rpm -V tree  ---再检查,发现文件的属性和哈希值等发生了变化
S.5....T.  d /usr/share/doc/tree-1.6.0/LICENSE

rpm安装tree包时,会把每个文件的属性以及哈希值等保存到rpm数据库中,用rpm -V 进行检查时,就是将数据库中文件属性以及哈希值等和目前的文件进行比对,看是否有变化。

  • 检查发行的软件包文件
[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

可以检查软件包文件的完整性和签名,是在导入公钥的前提下。

5、使用gpg工具实现公钥加密

centos6端进行的操作
[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,说明公钥和私钥还没有
-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
存放公钥的文件大小已经发生变化
-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
存放私钥的文件也是发生变化
-rw-------. 1 root root 1280 Sep  8 12:21 trustdb.gpg
[root@centos6 app]#gpg --list-key   ---查看一下,发现公钥已经生成
/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  ---查看私钥也已经生成
/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   ---导出公钥到一个文件中
[root@centos6 app]#scp centos6.pubkey 172.18.21.7:/app
[email protected]'s password: 
centos6.pubkey                                                                                      100%  984     1.0KB/s   00:00   
把公钥文件传给centos7
在centos7中进行的操作
[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
发现公钥和私钥都已经生成
[root@redhat7 app]#gpg --import /app/centos6.pubkey  ---将centos6的公钥导入centos7中
gpg: key 84BCC1E9: public key "centos6" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
[root@redhat7 app]#gpg --list-key ---发现导入成功
/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这个文件
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
[email protected]'s password: 
bak.sh.gpg                                                                                          100%  243   358.3KB/s   00:00    
把这个文件传给centos6
在centos6中进行的操作
[root@centos6 app]#gpg -o bak.log -d bak.sh.gpg   ---解密这个文件,我们发现自动就是用自己的私钥解密
gpg: encrypted with 1024-bit RSA key, ID 8DC5A90D, created 2017-09-08
      "centos6"
[root@centos6 app]#cat bak.log   --可以看到这个文件的内容了
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

总结:在生成公钥和私钥时,需要一些时间,并要不断的移动鼠标,或者敲键盘才能生成,建议实验的时候选择1024大小,避免浪费时间。删除公钥时要注意,要先删除自己的私钥才能删除公钥。

6、CA和证书

如果a要想给b传数据,使用b的公钥去加密,怎么才能保证得到的公钥是b的呢?这就需要一个第三方的权威机构,称为CA认证机构,颁发证书给b,b首先将自己的公钥pb传给CA,CA进行的操作是颁发证书:sca(pb)+CA+算法+有效期等,首先用自己的私钥去加密b的公钥,相当于数字签名,并将证书和算法有效期等一起传给b,b再将这证书传给a,a因为认可这个机构,所以a有CA的公钥,就可以解密这个证书,得到b的公钥。一般CA还会有上级CA,称为根CA,他的下一级CA称为子CA,根CA给子CA颁发证书,子CA再给b颁发证书,根CA是用来给子CA证明合法性的,根CA谁来证明呢,只有自己证明自己,自己签名自己的公钥,也就是b得到的证书是srootca(psubca)+ssubca(pb),根ca用自己的私钥签名子ca的公钥,然后把证书传给子ca,子ca用自己的私钥签名b的公钥,a得到这个证书后,因为认可根ca,所以有根ca的公钥,就解密子ca的公钥,得到子ca的公钥后,就可以解密b的公钥,得到b的公钥了。
PKI: Public Key Infrastructure
签证机构:CA(Certificate Authority)
注册机构:RA
证书吊销列表:CRL
证书存取库:
X.509:定义了证书的结构以及认证协议标准
版本号 序列号 签名算法 颁发者 有效期限 主体名称 主体公钥
CRL分发点 扩展信息 发行者签名
证书类型:
证书授权机构的证书
服务器
用户证书
获取证书两种方法:
•使用证书授权机构
生成签名请求(csr)
将csr发送给CA
从CA处接收签名
•自签名的证书
自已签发自己的公钥

你可能感兴趣的:(2018-05-16 安全和加密 1)