如何实现数据在网络中的通讯
如何实现数据在网络中的通讯
Kagula
2011/9/7
介绍
数据在网络中通讯会面临两个问题[1]数据的完整性[2]数据的安全性
数据完整性,指的是发送出去是什么样(长度和比特)的数据,接收到的就是什么样的数据,即数据不会在传输途中失真。
数据安全性,指的是数据内容不会被第三方(人)理解(可读)。
针对这两个问题本文提出了一个解决思路,重点放在数据的完整性这个问题。
这里假设网络通讯是在TCP/IP协议之上进行的。
阅读前提:[1]TCP上面的数据通讯编程经验[2]了解基本加解密方面的知识
正文
对在线服务器上来说万分之一的数据通讯出错也可能造成灾难性的后果,所以我们先要保证数据的完整性。
Q1:如何保证数据的完整性
A1:如下图所示,把要传送的数据分成一个个等长的数据包(根据TCP协议的特点,数据包的长度被设为1024字节)再传送。
由于每个数据包内含有数据包特征码,所以可以有效检测数据的完整性。数据包特征码一般采用CRC64或MD5方式生成。若接收到的数据包不完整可以要求发送方重新传送。
图一 数据发送流程图
具体实现:
可以把1.1做为一个模块,1.2和1.3封装成数据通讯模块,1.1以异步方式调用数据通讯模块,完成数据发送任务后数据通讯模块以代理(或消息)的方式通知应用层数据发送情况。同理实现“接收方”的编码。
Q2:如何保证数据的安全性
A2:在数据完整的前提下,我们可能对消息进行消息加密,通常消息是一个数据结构体:
[1]不同的需求、不同的开发规范,都会导致消息结构的多样化
[2]虽然这样,但是为了保证数据的进一步安全,我们可以对消息进行加密。加密会生成密文、和**(有一个或两个)。**可以跟随密文一起发送或单独发送。下面列出几种简单的加密方式。
[a]对称**加密,[a-1]**作为消息的一部份,发送端和接收端用同一把钥匙解密。缺点是,若hacker清楚**在消息体中的位置,就可以解出明文。[a-2]密文和**分别传送。缺点是,若hacker知道每次传送的信息体是密文还是**,而且知道它们的对应关系,就可以解出明文。
[a-1]、[a-2]中的**每次数据传递只用一次,加密算法(采用某种加密方法的变种)只有数据发送方、接收方知道,且不定时更新,这样可以加大hacker的**难度,一般没有这个必要。
[b]非对称**加密,[b-1]由数据发送方发出请求,请求接收方生成**和公钥,并返回私钥给数据发送方用于消息加密,数据发送方得到消息后,用私钥加密,然后加密文发送数据接收方,由数据接收方的应用层用公钥解密。
我倾向于使用[a-1]的方式,因为它的代码实现最简单,而且hacker也不会知道你采用什么样的加解密算法,在一般场合下使用足够了,实在有特殊需要,可以对“**”采取[b-1]的模式加密,进一步增加安全性。
参考资料
[1]《RSA算法》
http://baike.baidu.com/view/7520.htm
[2]《AES》