不管是cs模式还是bs模式(,为了方便讨论,下文通称为cs),都脱离不了一个安全,常规模式下一般采用明码在网络上进行数据传输,如邮件服务器,采用明码方式进行数据传输的方式已经在现实应用中被证明相当的不安全,尤其是在进行账户信息验证的时候,账户和密码信息很容易暴露,所以我们想到了对网络传输数据进行加密操作,而常规的传输方式有很多,简单的就是对密码进行md5加密,或者是对网络数据进行简单的异或处理,这种加密方式存在一定的隐患,就是当我们的网络数据包格式固定加上加密算法固定后,这种加密方式很容易被破解。
如何提高加密的安全度,我们需要做的就是保证密钥的安全,在对称式(des)加密,md5加密,异或等加密过程中,我们的密钥是要通过网络传输给对方,让对方和自己拥有同一个加解密钥,否则通话的双方无法正常进行下去,这种方式下就把我们的密钥直接暴露在网络中,不管我们连接开始使用上述那种加密方式,毕竟报文的格式是固定的,密钥的位置也是固定的,拥有了密钥我们就可以对通话进行加解密操作,为了安全,我们可以考虑采用周期性更改密钥,如上所述通过报文的方式破解密码的话,这种周期性的更换密钥的修改不会给后期的继续破解带来多大的麻烦,当然如果产品周期的改动(升级)很(或者是比较)离谱的话,我想对设计者(,开发者)来说也是个麻烦,毕竟产品升级这块,作为产品设计者(,开发者)需要花更多的功夫,其目的就是为了保证客户的体验,不能说产品自动升级后,由于加密算法的问题导致产品无法正常登录或运行!!!!!
那么我们需要做的工作就是保证密钥的安全,在我目前的产品中,也使用到了加密,而且我采用的是openssl中的rsa加密方式,所以这里讨论一下如何使用rsa加密保证网络传输的绝对安全,以弥补网文对这块讨论的不全或者是不系统。
关于RSA的描述我就不多说,网文多的是自己去看,我仅仅讨论如何使用!!!
RSA密钥包括公钥和私钥,而且是一一对应,网络上都说是一一对应,估计会让很多刚开始涉及到这块的人不知道是如何对应,或者是如何利用这种对应关系,这也是我要在本文中讨论这种加密方式的原因,我们可以采用RSA(API,程序)接口生成私钥,然后在通过私钥产生公钥,他们的关系就是公钥加密,私钥解密(这就是一一对应关系,后面将详述),如何在网络中使用,我们可以避开传统加密方式,传统的加密方式就是建立安全传输数据,而RSA是帮我们建立安全连接,然后在连接上我们可以进行安全传输数据的功能,好下面我就来详细描述RSA安全连接的建立过程,注:不附代码了,openssl中有案例,自己看一下就能明白。
机制:采用三次握手。
1: 客户端A 生成RSA私钥A-PRI 然后通过A-PRI生成A-PUB,
将A-PUB和一个随机串(A-RAND-S)传输给服务器SERVER(,无须对A-PUB进行加密操作,为什么后面描述)
这个过程采用明码传输。
2: 服务器收到A-PUB后建立针对客户端A的加密KEY,我们还称为A-PUB,
然后服务器建立自己的私钥S-PRI,在通过S-PRI生成S-PUB
使用A-PUB对S-PUB以及客户端传过来的A-RANS-S以及服务器断的随机串(S-RAND-S) 进行加密,然后将加密后的数据传给客户端A,此后服务器传输数据给客户端A,一直使用A-PUB进行加密。
3: 客户端A,收到2中的加密数据后,用A-PRI进行解密,将解密出来的(A-RANS-S)与本地的串进行比较,如果一样,说明服务器成功收到客户端A传过去的密钥A-PUB,并成功生成了加密key,然后客户端A利用S-PUB创建加密密钥S-PUB,在使用S-PUB将S-RAND-S进行加密,回传给服务器S.
4: 服务器S,收到3过程回传的数据后,采用S-PRI进行解密,然后比较S-RAND-S判断客户端A是否成功收到服务器的加密密钥,并生成加密key.
到这里,我们的数据传输安全连接就完成了,这种设计方式的优点就是在产品设计中,我们无须在代码固定密钥,每次建立连接都是随机生成密钥,双方都无须协商这种生成规则(,有些产品是自己不生成密钥,而是采用加载文件的方式创建rsa密钥,这种方式的缺点就在于如何保证加密文件不被别人窃取,而且我们还要做一些机制来限制加密文件的有效性,比如添加一个有效时间限制等),然后再建立安全连接。
问题: 整个连接的创建过程中,只有1使用了明码传输,这里我觉得没有太大必要在产品中使用一个简单的算法对公钥进行加密,毕竟公钥是用来进行加密操作的,而且我们也无法通过公钥发推出私钥,也就是说,连接创建成立后的加密数据我们是无法破解(解密)的,因为通话的双发都不知道对方的私钥是什么!!!!
我想到这里,大家也知道了RSA这一一对应的关系。也就是说在实际的网络传输中,我们用到了两个私钥(公钥),每个人都将私钥自己保存,然后把自己私钥对应的公钥送给对方,让对方采用自己的公钥对传输给自己的数据进行加密。
网络上更多的讨论就是RSA加密的长度问题,我个人觉得这不是问题,跟DES加密方式一样,存在问题的跟就是加密的对齐问题,DES的对齐方式是8个字节,而RSA的对齐方式就是 RSA_size(key) - X,这个X具体跟选择补码(pading)方式有关。
实际中加密可以考虑循环加密方式
//
加密伪代码
padlen = RSA_size(key) - X
loop = src_len/padlen;
rest = src_len%padlen;
psrc=src;
pto = to;
// 注意,测试过程中你会发现,for循环中的
// ret ,每次都一样,会根据你创建密钥的方式不同而不同
// 我的密钥是1024伪,这里ret就是128
for (i = 0; i < loop; i++){
ret = encrypt(padlen, psrc, pto, X);
if (ret == -1)
return -1;
psrc += padlen;
to += ret;
}
if (rest == 0)
return pto - to;
ret = encrypt(rest, psrc, pto, X);
if (ret == -1)
return -1;
// psrc += padlen;
to += ret;
// 解密代码同加密代码,padlen值就是for中的ret。
722



被折叠的 条评论
为什么被折叠?



