先从网络安全的要求说起:
- 保密性(Confidentiality)
- 完整性(Integrity)
- 可用性(Availability)
- 认证 (Authenticity)
几种典型的攻击类型:
- DoS, Denial of Service(僵尸网络)
- 嗅探 (到底什么程度的爬虫才算攻击?)
- 中间人
针对僵尸网络,买足够多的服务器或者流量托管都是可以做到一定程度的防护。不在本文讨论范围内。
针对一般的个人级网络安全。本文主要讨论加密算法。
OK,首先介绍对称加密(symmetrical encryption)和非对称加密(asymmetrical encryption)
对称加密即,加密与解密时使用的密码是同一个密码。
相对的,非对称加密即,加密与解密时使用的密码不是同一个。
T -------> Message --------> R
Key1 Key1
对称加密
T -------> Message --------> R
PriKey1 PubKey1
R <------- Message <-------- T
PubKey2 PriKey2
非对称加密
非对称加密解密所使用的一对秘钥(公钥,私钥),由公钥加密的信息,只能由私钥解密。
RSA算法:
密文= 明文^e mod N {e,N}为私钥
明文= 密文^d mod N {d,N}为公钥
OK,比较一下二者。
使用对称加密算法做加密通信,A与B通信,需要提前知道B的秘钥。与C通信,需要知道C的秘钥。同理B和C也都要保存A的秘钥....... 在秘钥不被泄露的情况下,及时密文被截获,也没用。B在没有C的秘钥的情况下伪装成C与A通信,A使用C的秘钥解密发现没用,就会知道有假。但是有一种情况,如果B是个坏人,且A是个傻子。A在与B和C通信时使用了同一个秘钥,而且A与C的通信被B监听,且A与C之间的加密算法被B得知,那么是可以被B解密出明文的。相比较而言,非对称加密就没有这样的问题。
使用非对称加密算法稍复杂一些。A会向外公布自己的公钥,保留私钥不被公开。同理,B,C都向外发布自己的公钥。A在发消息给B的时候,用B的公钥加密,B在收到之后,用自己的私钥解密。A如果希望广播消息,用自己的私钥加密,收到的人用A的公钥来解密。这时候我们再来考虑一下之前对称加密的那个问题。就算B手里有A和C的公钥,也没办法解密AC之间的密文。
说完这个,再来说说共同点,在端到端通信所使用的秘钥不被第三方得知时,都可以保证通信的保密。
但如果B是个绝顶聪明的坏人:
1)设法阻断A与C之间信道
2)使用对称加密时,假装C发给A秘钥,用于之后与A的通信。使用非对称加密时,假装C发布公钥。
这样一来B完全可以从头到尾伪装成C。
还有,如果B是个没那么聪明但是足够坏的坏人:
1)设法阻断A与C之间信道
2)截获密文并随意修改其中内容,及时他不知道是什么内容(而且A,C不知道内容被修改了)
以上两种问题,数字签名可以解决
数字签名
首先我们规定一下密文格式:
明文
{密文}
[秘钥|加密算法]
1.browser -> server Hello
2.server -> browser Hello Im server
3.browser -> server prove it
4.server -> browser Hello Im server{Hello Im server}[private key|RSA]
5.browser -> server {请使用以下的对称加密算法,算法,秘钥}[public key| RSA]
6.server -> browser {OK}[算法,秘钥]
7.browser -> server {账号密码,请给出余额}[秘钥,算法]
8.server -> browser {余额:xxx}[秘钥算法]
用这种非对称加对称的方式,可以保证对称加密秘钥算法的安全。而且可以检查通信内容是否有被修改。
在browser上只要有确定是server的公钥,就可以保证安全。那么问题就是,你说你是server,我怎么相信你。也就是server的公钥是否真的是server的公钥。
server在证明自己是server的时候,使用数字证书,即:
server -> browser Hello, this is my cert //以保证证书可靠性
browser -> server prove it
server -> browser Hello,Im server{Hello Im server}[私钥 | RSA]
数字证书包含:
xxxxxxxxxxx证书内容xxxxxxxxxxxxxxxx
证书发布者(Issuer),
证书有效期,
公钥,
公钥所有者,
签名及算法,
指纹及算法,
。。。。
{证书指纹及计算指纹的算法}[issuer 的私钥 | RSA]
xxxxxxxxxxxxxxxxxxxx证书内容结束xxxxxxxxxxxxxxxxx
issuer,是为server颁发数字证书的公信力。server在后续非对称加密时所用的私钥加密出的密文,如果可以被数字证书解密后的server的公钥解密,说明是真的server。解密数字证书所用的issuer的公钥,预装在操作系统内。(如果你相信你所用的操作系统即相信issuer,那么请相信当前声称自己是server的人,猜疑链终止。)
补充一点,所有的秘钥理论上都可以被暴力破解。现代加密算法对秘钥的要求基本可以保障,暴力破解一个秘钥,需要几千年。
第一次写文章,各位看官轻喷。主要是给自己一个总结的地方。