转载自:http://www.cnblogs.com/piyeyong/archive/2010/06/10/1744692.html
要想实现在不安全的网络上的安全通信,需要考虑3个方面的问题:保密(Privacy),认证(Authentication),完整性(Integrity)。
1.保密(Privacy)
数据在网络传输的过程中,需要经过多个中间节点进行转发,因此,数据很容易就被截获,为了保证数据的保密性,就需要对数据进行加密传输,使用密文进行传输。
如上图所示,明文数据(plaintext)经过加密算法(Encryption Algorithm)得到密文(ciphertext),在网络中传输,到达目的地后,再经过解密算法(Decryption Algorithm)还原成原文。
在网络中传输的是密文,即使被第三方截获,也不能解析其含义。注意,这里的加密和解密算法是公开的,如对称算法DES,3DES,非对称算法RSA 等,任何人都可以得到,但是每种算法都需要有一个KEY作为输入,对称算法与非对称算法的区别就在于加密的KEY和解密的KEY是否一样,一致的是对称算 法。
由于非对称机密在效率上比对称加密慢100倍以上,并不适合对大数据量的原文使用非对称加密,在实际的加密传输过程中,会随即生成一个对称密钥 (session key),使用该对称算法对原文进行加密,同时使用非对称算法将session key进行加密,一起传输给对方,接收者使用private key将session key还原后再用对称算法对数据进行解密。
2.认证(Authentication)
数据的接收方在收到数据后,为了验证数据确实是从发送着发送的,而不是第三方冒充的,就需要对发送方进行认证。认证需要使用一个凭据,即数字证书 (Certificate),相当于个人的护照。Certificate由专门的证书管理机构发放,就是我们常说的CA(Certificate Authority)。Certificate含有发放者(Issued by),使用者(Subject),公钥私钥等信息,并且是被CA使用自己的证书签名的。我们验证身份的时候,实际是相信发放证书的CA,就好比我们查看 护照的时候是相信发放证书的国家一样。这里需要详细说明一下签名。
如上图所示,使用Private key对明文进行加密计算,得到数字签名,改签名只能使用Private key对应的Public key才能解密,重新得到原文。Public key是公开的,所有人都可以得到,并且知道该Public key是属于谁的.如果A要发送数据给B,A就用自己的Private key计算签名,发给B,B再使用A的Public key进行验证,如果能计算出原文,则证明该数据确实是A发送的。而第三方C如果想假冒A给B发送数据,由于没法得到A的private key,就没法对数据进行签名,如果使用任意key签名,B在收到数据后使用A的public key解密时就会发现数据无法还原,从而发现数据是假冒的。实际的应用场景是这样的:
A首先对要发送的数据计算Hash,只对该Hash进行签名,这样会大大提高效率,然后将原文和签名一起发送(为了保证原文的Privacy,需要 使用B的public key进行加密,只有拥有private key的B本人才能进行解密),B在收到后,使用同样的Hash算法对原文计算Hash(如果原文加密,要先进行解密哦),同时对数字签名使用A的 public key解密,比较两者是否一致,不一致就说明数据不是由A发送过来的。
由于只有A本人采用与自己的Private key,所以数字签名还具有不可抵赖性。
3.完整性(Integrity)
即使数据被加密传输,第三方无法知道传输的内容,但是当第三方还是可以进行破坏活动,例如将数据截取一半,再发给接收者,接收者进行解密后并不知道 数据已经被截断。为了保证传送的数据完整性,需要对接收到的数据进行完整性校验,可以使用hash算法,对原文计算hash,接收者验证hash即可,过 程参照上一小节数字签名部分。