TCP/IP跨主机之间的通信数据封装发送的都是明文数据,现代通讯中会有安全问题。
三个安全问题
如:A发送消息给B的三个安全问题
机密性:明文传输如:ftp,http,smtp,telnet等
完整性:数据可能被篡改(举例:电商下单生产数量或者传输过程信号错乱)
身份验证:A和B从未见过(举例:钓鱼网站冒名顶替,保证对方即是其所声称的身份)
解决上述三个问题可以通过加密算法的混合使用,常见加密算法有如下
对称加密
DES:数据加密标准,早期使用的56bit密钥
3DES:Triple DES 对每个数据块应用三次DES加密
AES:高级加密标准128bit默认,还有AES192、AES256、AES512
单向加密
MD5
SHA1 输出长度为160
SHA192/SHA256/SHA384 输出长度
公钥加密:核心功能是数据加密和签名
RSA:实现加密和签名,部分公开使用
DSA:只实现签名,公开使用
三个问题的解决
机密性假如传输数据abc,为了不让互联网上的其他人获取,就要加密,那么如何加密呢?加密就是转换规则,把明文转换成密文,plaintext-->转换规则-->ciphertext。
如果其他人获得了转换规则(算法)怎么办?通常更换的是秘钥而不是算法,设计思想是靠秘钥保证机密性而非算法,换秘钥更简单
加密算法--对称加密:用于加密任意大小的数据块数据内容,加密方和解密方使用的是同一个密码,加密速度快。如:A要与BCDEF…通信,各方不同密钥,密钥管理复杂。缺点:通信对象多的时候,无法有效对密钥管理。
↓↓
完整性如何保证数据不被篡改?加密算法—单向加密:抽取数据的特征码。把特征码附加在原文之后一并发送。
单向加密特性:
输入一样,输出必然一样;
雪崩效应,输入的微小改变,将会引起结果的巨大改变;
无论原始数据是多少,结果大小都是相同的;
不可逆,无法根据特征码还原原来的数据
中间人攻击:修改数据和特征码重新发送。所以数据完整性的手段无法保证完整性本身,要借助其他机制——加密特征码。特征码能够使用对称加密,可是在两个人第一次通信时,由于互相都不知道对方的密钥,在网络上传输密钥时是明文传输的,密钥安全性不能得到保证。
如何实现双方协商密钥,但是却不让第三方得到密钥?——密钥交换
最早的Diffie-Hellman IKE(Internet Key Exchange)互联网密钥交换
①A、B各自选择两个数字p,g(大素数,生成数)
②A、B各自生成自己的随机数x,y
③A:g^x%p—>B B:g^y%—>A 把计算结果发给对方
④A:(g^y%p)^x=g^yx%p(结果就是密钥) B:(g^x%p)^y=g^xy%p
通过这种方式,双方只知道自己的x,y,但是经过计算可以在未知对方x或y的情况下得到相同的一个数值(g^xy%p)
↓↓
密钥交换后可以加密特征码,可是还是没有解决问题,仍然无法验证对方身份
如何验证对方身份?催生第三种加密算法产生--公钥加密算法
公钥加密(非对称加密)加密和解密使用的是不同的密码,有公钥和私钥,密钥是成对出现的,公钥是从私钥中提前出来的,私钥是很长的,私钥加密速度比较慢。公钥是公开的,公钥加密需要用私钥解密,用私钥加密得用公钥解密。
用对方公钥加密数据,可以保证机密性。发送方用自己私钥加密,可以实现身份验证
公钥加密算法速度太慢,不适用于加密数据,慢于对称加密三个数量级,用于身份验证
结合两种加密(保证完整性+身份验证)
使用私钥加密特征码,中间人能解密可以修改数据,但是接收方可以发觉。这一切的保证就是公钥,那么从哪里获得公钥?
↓↓
如何保证不是中间人的公钥,只能借助于第三方机构。
这里最重要的一步就是公钥的获取,如何得到对方的公钥,又如何得知一定是对方的公钥?
此时就需要依赖于CA,每个人所发的公钥对方无法验证其真假,就像你说自己是xx,那怎么证明你就是xx呢?生活中我们都是通过身份证来验证的,但是身份证不能你自己做一张印上一个名字,就说自己叫xx,需要提供一张由公安部门所颁发的权威的身份证才能得到认可,因为大家是信任公安部门的权威性的。这里把公安部门称为第三方机构也即是这里的CA。AA和BB通信之前要向CA去注册认证自己的身份。
AA向CA申请给自己发一个证(里面包含公钥、名字、有效期等CA会使用单向加密计算这些数据特征码,CA再用自己的私钥加密这段特征码并附加在证书的后面,即数字签名,保证了证书的信息没有被更改),AA就把自己的证给BB,那此时BB如何去验证AA发来的证书不是伪证书?则BB需要信任CA,才能信任CA所颁发的证书,BB使用CA的公钥解密这段特征码,再用相同的单向加密计算这些数据特征码,比较两个特征码是否一致。
获取到CA的证书就包含了CA的公钥,此时CA的证书(公钥)从何而来呢?CA是自己给自己给发证书的。用自身的私钥给包含公钥的证书签名。如何判断获得的CA的证书就是发证机关的?无法保证。你可以到颁发机构本地复制证书,还有一些电子商务网站,你信任这些网站,你访问时就安装它的证书。且需要提供有公信力CA是需要向根CA注册申请,都是需要收费的。
虽然私钥把特征码加密附到源数据一起发送可以解决完整性和身份验证问题,但是数据仍然未加密,此时通过秘钥交换形成的对称秘钥把有附加信息的源数据整体再次加密就能解决机密性问题。
秘钥交换除了上述的DH算法,也可以通过对称秘钥来实现
以随机生成一个数当加密密钥,用接收方的公钥加密后加在数据后面发送出去,接收方用私钥解密获得对称密钥,用对称密钥解密数据,最后用私钥解密特征码。
证书
证书颁发机构和彼此间的信任关系述组成了PKI(public key infrastructure公钥基础设施),基本组成如下:
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存取库:
证书颁发机构(根证书颁发机构)派发出子机构 ,称为RA,用于接受证书申请,最后发给CA签名。
还有一种特殊情况,如果说证书(私钥)丢失了,该如何处理呢?私钥丢了,必须让获得公钥的主机知道公钥被废了,因此CA机构需要维持一张列表(证书吊销列表),一旦私钥丢弃,则向CA申请自己的证书作废。CA机构就把丢失私钥的主机放到证书吊销列表中。
crl:证书吊销列表,Certificate Revocation List;保存此前发出的仍未过期但被撤销的证书。则通信时,还需要增加一步就是通信的对方收到数据后,需要到CA机构查看发送方是否在证书吊销列表中。(注意互联网上绝大部分通信者都没有这样做,因此互联网上通信还是存在安全隐患的)
一个证书中应该包含什么?
不同标准下的证书格式是不同的,主流的标准格式如x509(国际电信联盟ITU-T 制定),包含
主体名称:证书的合法拥有者
附加在最后是通过CA私钥签名的证书特征码
获取证书就是为了获得对方公钥,如何验证证书
1、利用本地预存的公钥信息,解密颁发机构的签名
2、解密获得证书的特征码,验证此证书内容没有被篡改
3、联系证书颁发机构确认证书有效可用
有两种PKI:TLS/SSL使用的是x509的证书;OpenGPG是另一种证书管理机制(或者叫PKI的实现架构)
另外为了验证证书不是由伪装的CA颁发的,必须通过可靠的途径来获取可信任CA的公钥(如厂商之间互相信任内置公钥)