zoukankan      html  css  js  c++  java
  • 网络传输与加密 (2)

    网络传输与加密

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

    有了“原信息”和它对应的“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指纹同时换掉吗?

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

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

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

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

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

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

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

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

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

    近期回顾

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

     

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

       

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

  • 相关阅读:
    verifycode验证码模版
    输出一个整数的每一位,如:123的每一位是1 , 2 , 3
    编写代码模拟三次密码输入的场景。 最多能输入三次密码,密码正确,提示“登录成功”,密码错误, 可以重新输 入,最多输入三次。三次均错,则提示退出程序
    获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列
    一台客户端有三百个客户与三百个客户端有三百个客户对服务器施压,有什么区别?
    软件生存周期及其模型是什么?
    试述软件的概念和特点?软件复用的含义?构件包括哪些?
    Spring Cloud Stream与Spring Cloud Bus区别
    Spring的设计模式
    JavaScript的事件循环机制总结 eventLoop
  • 原文地址:https://www.cnblogs.com/kid551/p/9434055.html
Copyright © 2011-2022 走看看