网络传输与加密 (2)
2019-08-28

网络传输与加密

让我们先回顾一下上次的验证过程,如下图

 

 

有了“原信息”和它对应的“md5签名字符串”,我们就可以做最基本的信息验证:通过md5签名字符串的一致性,来保障我们收到的信息没有受到更改。

P.S.:由于签名signature在后续文章中会另有所指,为区分md5签名字符串,我们将md5签名字符串的叫法,更改为md5指纹字符串。意思同签名是一样的,就是A之所以是A的证据、特征,可以用签名来表示,也可以用指纹来表示。这里,我们开始将md5字符串对应的这个特征,称作md5指纹。

但一个容易发现的漏洞是,如果“原信息”和“md5指纹字符串”同时被修改了该怎么办?原信息被代提成了伪信息,而md5指纹字符串也被替换成了伪信息所生成的md5码,这时候,原有的验证过程都可以走通,根本无法发现信息被修改了或者替换了。

 

 

为了解决这个问题,在工业实践中便会将验证和加密进行组合使用。除了单纯的组合,还会引入一些基本的小技巧。

例如,因为md5的验证算法是公开的,所以很容易生成一份信息的md5指纹字符串,从而对原信息进行伪造。那么,可以不可以让人无法或者说难于伪造这份信息的md5指纹字符串呢?

一个小技巧是:并不提供原信息的md5验证码,而是提供“原信息+a key”的md5指纹字符串:

 

 

这个key,就是一串如“2d2316235b41924ac7c4b194661d2984”这样的随机字符串,它由“发信人”和“收信人”分别单独保存。

这时候,我们的验证流程就变成了:

发件人将“原信息”和“key”一起打包,生成一个md5指纹字符串。再将原信息和md5指纹字符串发送出去。

收件人收到信息后,将“接受信息”和“key”一起打包,生成一个md5字符串,再与接收到的md5字符串比较,看它们是否一致。

在这样的情况下,即便是原信息和md5字符串同时被修改了,但因为伪造者并不知道这个md5字符串是在原有信息的基础上,增加了什么样的一个key字符串来生成的,他就几乎不可能提供一个“原信息+key”的md5字符串。因为他无法逆向推导出那个key长成什么样。而这个“几乎不可能”,是由md5加密算法所保证的。

另一种保障“原信息”和“md5指纹字符串”的方式,是直接考虑把md5验证码做加密。这种方式并不同上面的小技巧相冲突,事实上它完全可以和上面的技巧结合,构造出更安全的方式。但为了降低理解的困难程度,让我们先暂时抛开上面的小技巧,只是单纯地考虑“原信息”“md5指纹字符串”和“md5字符串加密”这三样东西。

还是回到刚开头提到的核心想法,为什么仅有“原信息”和“md5指纹字符串”是不安全的?因为这两者的对应关系是由一个已知的算法连通的。之前的小技巧,是把这个用于连通的“已知”算法,通过一个私密的key,巧妙地把这个公开的“已知”算法变成了一个“未知”的算法,从而无法制造出对应的md5指纹字符串。

所以,这里的重点其实是,你没办法去伪造md5指纹字符串。

基于这样的考虑,我们还可以用别的方式,让其他人依旧无法伪造出md5指纹字符串,例如,你根本就不知道这个md5指纹字符串长什么样!

怎么做呢?那就是,我不再提供“原信息和md5指纹”的组合,而是提供“原信息”和“用私钥加密后的md5指纹”,也即是把md5指纹又做了一次乱码。

你或许会问,加密了md5有什么用?不是照样可以直接把信息和md5指纹同时换掉吗?

没错,你是可以这样做,但是,这时候作为接收方来讲,他的接受验证过程,已经变成了:

    用公钥解密,得到一串字符串,当作原信息的md5指纹。

    将md5函数作用在接收到的信息,得到一个本地生成的md5指纹。

    将本地生成的md5指纹和原md5指纹做比较。

所以,即便是你替换了原信息和md5指纹,但如果这个md5指纹没有被私钥加密过,那么按照上述步骤,通过公钥解密出来的字符串,便不会是相应的md5指纹,而是一串不知所云的乱码。从而,你必须通过私钥加密,才可以伪造md5指纹来欺骗接收方。

这个被加密了的md5指纹,也被称作数字签名(digital signature)。

此时,所有的安全问题,便落在了这个“私钥”上。只要它不被窃取,你发送的信息便是安全的、可以得到验证的。

那么,如何保证你的“私钥”不被窃取呢?使用网络传输吗?万一在半路上被劫走篡改怎么办?基于此,更为安全妥当的办法,便是使用物理传输,直接在现实中,手把手的将秘钥给发送方。

我们在生活中遇到过这样的情况吗?当然!还记得银行的网银盾么?为什么银行要煞费苦心地给你一个U盘?因为里面存放着你用来加密的私钥啊!(以及之后我们会谈到的证书)相比于通过网络连接将私钥发放给客户,直接通过现实中的实物来传递私钥,是更加可靠的。

 

 

 

 

 

近期回顾

《不是不屑,而是自保》《网络传输与加密》《为什么需要提前撰写Spec文档》

 

 

如果你喜欢我的文章或分享,请长按下面的二维码关注我的微信公众号,谢谢!

 

 

 

   

更多信息交流和观点分享,可加入知识星球: