• 互联网安全套路之加密、签名和证书


      互联网在为我们的生活带来极大便利的情况下,也引入了很多安全隐患。比如信息在网络传输过程中可能会被黑客截取并篡改,这会带来很严重的后果。为了解决信息在网络传输过程中的安全问题,对应就产生了:加密算法、数字签名和数字证书。

    一、加密算法

      加密简单理解就是将一串需要传递的明文信息转换为密文信息后再进行传输。接收方收到密文后,再按照规律进行解密,得到原始的明文信息。在这个信息的传输过程中,如果被黑客截获,但是因为信息内容是密文,所以黑客也无法得知信息的具体内容,从而保障了信息的安全性。
      加密算法可以分为对称加密和非对称加密。
      对称加密算法的特点是:双方使用同样的秘钥(可以理解成一串随机数,由信息发送方生成)进行加解密,算法计算量小,加解密速度快,因此被广泛使用在加密内容较多的场景下。常用的对称加密算法有:AES、DES等。但是加密算法有个缺点,就是发送方该如何将秘钥交给接收方呢?因为秘钥本身在网络传输过程中也有可能被黑客截获。
      非对称加密算法的特点是:双方使用不同的秘钥(一对“公钥和私钥”)进行加解密。用公钥加密的内容只有对应的私钥才能解开,反之亦然。公钥是对外公开的,任何人都可以获取公钥,但是不能通过公钥反推出私钥(非对称性);并且一个公钥有且只有一个对应的私钥(唯一性)。非对称加密算法因为不需要向对方传输私钥,因此安全性要比对称加密算法高。但是算法要比对对称加密复杂,加解密速度慢,不适合需要大量加密的场景。常用的非对称加密算法有RSA、ESA等。
      综上我们可以发现,对称加密算法效率高,适合用于大量加密内容,但是无法保证秘钥安全的传输给对方;而非对称加密算法不需要传输私钥,安全性好,但是算法复杂度高,加解密效率低,不适合用于大量加密。
      结合它俩的特点,以前的大神们想出了一个解决对称加密秘钥传输安全性的方法:先用接收方的公钥将对称加密秘钥加密,然后传输给对方;接收方收到后,用自己的私钥解密,就得到了发送方的对称加密秘钥,这样双方就可以使用对称加密算法愉快的通信了。这时候,即使对称加密秘钥在网络传输过程中被黑客截获,但是秘钥被接收方的公钥加密过了,黑客没有接收方的私钥,无法破解。这个方法保证了秘钥传输的安全性,同时后续的通信内容是用对称加密算法进行的,也兼顾了加密通信的效率。
     
      上面的方法看起来已经万无一失了,黑客即使截获了秘钥,也无法破解。但是,黑客仍有办法搞事情---篡改信息。比如黑客虽然无法破解秘钥,但是因为接收方的公钥是公开的,黑客也能获取到,所以黑客可以自己伪造一份对称秘钥,然后使用接收方的公钥加密,再传给接收方。这时候接收方使用私钥解密后,得到的对称秘钥就是黑客传来的,而接收方完全感知不到这点,后续使用黑客的秘钥加密传输内容,这就出问题了。
      为了解决这个问题,就需要用到数字签名大法。

    二、数字签名

      1.摘要算法
      介绍数字签名之前,需要先提一下摘要算法。摘要算法可以简单理解为:一份源文本,经过摘要算法处理后,得到一串摘要值。(可以理解为哈希)
      摘要算法的特点:同一份源文本,使用同样的摘要算法,得到的结果相同;而不同的源文本,即使使用相同的摘要算法,结果必然不同。并且,无法从摘要值反推出源文本(这是摘要算法与加密算法的显著区别,加密算法经过解密后是可以得到初始明文的)。基于以上特性,摘要算法可以用来校验信息是否被篡改,因为篡改后的信息和摘要值肯定无法匹配。
      常用的摘要算法有:MD5、SHA等。
      2. 数字签名
      上面提到摘要算法可以用来校验信息是否被黑客修改。但是万一黑客改完源文本后,连摘要值也一起篡改了呢?这时候数字签名就排上用场了。
      数字签名说白了就是加密后的摘要值。发送方使用摘要算法提取出源文本的摘要值后,使用自己的私钥对摘要值进行加密,得到源文本的数字签名,再使用接收方的公钥对源文本进行加密,这样源文本和摘要值都是密文了。在消息传输过程中,将数字签名附上一起传输。
      即使信息被黑客截获,黑客通过发送方的公钥解密出了摘要值,但由于摘要算法的不可逆性,无法反推出源文本的内容。而如果黑客想要篡改信息,重新伪造一份源文本,就算他使用同样的摘要算法伪造了摘要值,但是因为他没有发送方的私钥,这时他是没法生成数字签名的。接收方收到篡改后的信息后,如果可以使用发送方公钥正常解密数字签名,得到摘要值,再使用自己的私钥解密源文本,得到文本内容,最后再使用同样的摘要算法提取文本内容的摘要值和数字签名解密出来的摘要值做对比,二者一致就可以证明源文本没有被人篡改过;如果无法使用发送方的公钥解密数字签名,或者重新提取的摘要值和数字签名中的摘要值不匹配,这时候接收方就可以意识到信息可能是被篡改过了。
      到了这里是不是看起来一切都没问题了?Naive。黑客还是有办法搞事情的。因为接收方无法确定自己用的公钥就是发送方的公钥。黑客完全可以一开始就伪造一个发送方的公钥传给接收方。黑客再使用自己的私钥去伪造数字签名,附在伪造的源文本上一起传给接收方。因为接收方可以正常使用发送方的公钥(此时已是黑客伪造的公钥)解密数字签名,并且伪造的数字签名和伪造的源文本是匹配的。这时候接收方还是无法识别信息被篡改。
      可以发现,这时候问题的关键点在于如何确保发送方公钥的可靠性。为了解决这个问题,就需要用到数字证书大法。

    三、数字证书

      数字证书是一份经过证书授权中心(CA)签发数字签名的,包含有公钥所有者信息以及公钥内容的文件。简单理解,数字证书里包含有:公钥、公钥所有者的信息、CA的数字签名、CA名称、证书有效期、序列号等信息。
      数字证书如何保证公钥的可靠性呢?关键在于CA的数字签名。CA使用摘要算法得到数字证书内容的摘要值,然后用自己的私钥进行加密,得到数字签名。这样证书的使用者在得到数字证书后,只要使用CA的公钥(任何人都能获取)解密数字签名,得到摘要值,再使用同样的摘要算法提取数字证书内容的摘要值,二者进行对比,就可以知道证书是否被篡改过了。
    这里我们可能又会发现,数字证书安全性的关键就是确保CA的私钥和公钥是可靠的。这一点的话可以由受信任的CA机构来负责保证,因为这是要给钱的,花钱保平安~
      申请商用证书实质上就是把自己生成的公钥等信息发给受信任的CA机构,由他们签署数字签名,这样一份可靠的数字证书就诞生了。(私钥不用发给CA,自己保存就好)

    Ps:自签名证书

      顾名思义,自己给自己的证书签署数字签名。自签名证书中是没有受信任CA机构的信息的,所以使用自签名证书提供服务的时候,都会在浏览器上提示证书不安全之类的问题,这是因为浏览器无法在受信任的CA机构列表中找到证书中的CA机构信息,所以认为证书不安全。要想规避的话,只需将证书添加到受信任的CA机构列表中即可。但是要彻底解决的话,还是需要花钱去申请商用证书。
      自签名证书的优点:不要钱;缺点:证书可能在传输途中被篡改。
     
  • 相关阅读:
    flutter开发No toolchains found in the NDK toolchains folder for ABI with prefix: armlinuxandroideabi错误的解决方法
    android开发 [CXX1104] NDK from ndk.dir at androidSdk\ndk\21.1.6352462 had version [21.1.6352462] which disagrees with android.ndkVersion [21.0.6113669]错误的解决方法
    android开发如何让Parcelable的使用和Serializable一样简单的解决方法
    flutter开发Build failed due to use of deprecated Android v1 embedding错误的解决方法
    android开发kotlin编译出错Module was compiled with an incompatible version of Kotlin
    android开发让App永不闪退,永不crash的解决方法
    android开发突破Android P及以上反射调用隐藏API限制的解决方法
    flutter开发The ADB at "androidSdk\platformtools\adb.exe" is too old; please install version 1.0.39 or later.错误的解决方法
    Android开发Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8.错误的解决方法
    android开发以调试模式启动app方便调试启动时的代码
  • 原文地址:https://www.cnblogs.com/lipengxiang2009/p/7471752.html
Copyright © 2020-2023  润新知