4. 三类算法的组合应用:
4.1. 加密通信
继续上文的例子,由于非对称加密的速度非常慢,所以我们考虑只用它来加密数据量小的一个临时密钥,用这个临时密钥来使用对称加密的方法加密实际的通信数据。终端向服务器发起通信的流程大致如下:
1.终端生成一个随机密码:symPassword.
2.终端将这个随机密码使用非对称加密加密,加密使用服务器对应的公钥(publicKey)。asyEncrypt(symPassword,publicKey),并将这个加密后的结果发到服务器端。
3.服务器端使用私钥进行非对称解密asyDecrypt(encryptedSymPassword,privateKey),解密得到symPassword.
4.终端使用symEncrypt(data,symPassword)对data进行加密,并将加密结果发送到服务器。
5.服务器使用symDecrypt(encryptedData,symPassword)对数据进行解密。
这个方案使用临时的对称加密密码来进行数据的加密传输,由于临时密码可以在每次通信建立时重新生成,所以不会有密码泄露的风险。
4.2. 数字证书
上文的加密通信还有个问题没有解决,就是服务器的公钥如何发放到众多的终端。如果只是小范围内使用,比如一个办公室内部,可以用U盘将服务器公钥拷贝到每个终端计算机上。但如果是一个公共网站,希望和全世界的所有用户的通信都是安全的,该怎么发放服务器的公钥呢?这将就要用到数字证书了。假定我们要为a.com的服务器发放一个证书,如下图所示:
终端访问a.com时,先下载上图右边所示的数字证书。一般证书是从a.com下载,但从其它地方下载也是安全的,因为数字证书要验证后才会使用。终端得到证书后,就开始验证它,验证步骤如下:
1. 把上图中证书下部的明文内容部分进行一次digest运算。
2. 根据明文内容中证书签发者的信息,在本机查找并验证证书签发者的公钥。(稍后详述这一过程)
3. 用证书签发者的公钥,解密证书上部的数字签名部分,使用asyDecrypt.
4. 将第3步的asyDecrypt结果和第1步的digest结果进行比较,如果一样,则认为证书合法;反之则说明证书非法或已损坏。
5. 如果证书合法,就可以把明文内容中a.com的公钥拿来使用了。
前面步骤的第2步具体怎么操作的?注意到我们其实是要检验证书签发者公钥的合法性,我们就需要一个关于证书签发者公钥的证书:
就这样一环扣一环,形成了一个称为证书链的东西。这样的循环什么时候结束呢?一直找到一个值得信任的证书或根证书。根证书是证书拥有者自己给自己签发的证书。根证书怎么验证合法性?答案是不能,我们选择信任它。我们为什么信任它,因为它是和操作系统或浏览器一起发布的。
在实际应用中,证书还有个过期的概念。这也是由非对称加密的特性3.2.2.决定的,为了防止经过较长时间的计算由某个签发者的公钥算出他对应的私钥。
|