zoukankan      html  css  js  c++  java
  • 转:iOS 客户端 HTTPS 防中间人攻击实践

    HTTPS是通过一次非对称加密算法(如RSA算法)进行了协商密钥的生成与交换,然后在后续通信过程中就使用协商密钥进行对称加密通信。

    HTTPS协议传输的原理和过程简图如下所示:


    HTTPS协议传输原理


    一共有8个步骤,我们针对每一步,具体看看发生了什么事:

    1. 第一步,客户端发起明文请求:将自己支持的一套加密规则、以及一个随机数(Random_C)发送给服务器。
    2. 第二步,服务器初步响应:服务器根据自己支持的加密规则,从客户端发来的请求中选出一组加密算法与HASH算法,生成随机数,并将自己的身份信息以证书(CA)的形式发回给浏览器。CA证书里面包含了服务器地址,加密公钥,以及证书的颁发机构等信息。这时服务器给客户端的包括选择使用的加密规则、CA证书、一个随机数(Random_S)。
    3. 第三步,客户端接到服务器的初步响应后做四件事情:
      (1)证书校验: 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等)。
      (2)生成密码:浏览器会生成一串随机数的密码(Pre_master),并用CA证书里的公钥加密(enc_pre_master),用于传给服务器。
      (3)计算协商密钥:
      此时客户端已经获取全部的计算协商密钥需要的信息:两个明文随机数 Random_C 和 Random_S 与自己计算产生的 Pre-master,计算得到协商密钥enc_key。
                                enc_key=Fuc(random_C, random_S, Pre-Master)
      (4)生成握手信息:使用约定好的HASH计算握手消息,并使用协商密钥enc_key及约定好的算法对消息进行加密。
    4. 第四步,客户端将第三步产生的数据发给服务器:
      这里要发送的数据有三条:
      (1)用公钥加密过的服务器随机数密码enc_pre_master
      (2)客户端发给服务器的通知,"以后我们都要用约定好的算法和协商密钥进行通信的哦"。
      (3)客户端加密生成的握手信息。
    5. 第五步,服务器接收客户端发来的数据要做以下四件事情:(1)私钥解密:使用自己的私钥从接收到的enc_pre_master中解密取出密码Pre_master。
      (2)计算协商密钥:此时服务器已经获取全部的计算协商密钥需要的信息:两个明文随机数 Random_C 和 Random_S 与Pre-master,计算得到协商密钥enc_key。
                                enc_key=Fuc(random_C, random_S, Pre-Master)
      (3)解密握手消息:使用协商密钥enc_key解密客户端发来的握手消息,并验证HASH是否与客户端发来的一致。
      (4)生成握手消息使用协商密钥enc_key及约定好的算法加密一段握手消息,发送给客户端。
    6. 第六步,服务器将第五步产生的数据发给客户端:
      这里要发的数据有两条:
      (1)服务器发给客户端的通知,”听你的,以后我们就用约定好的算法和协商密钥进行通信哦“。
      (2)服务器加密生成的握手信息。
    7. 第七步,客户端拿到握手信息解密,握手结束。
      客户端解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束。
    8. 第八步,正常加密通信
      握手成功之后,所有的通信数据将由之前协商密钥enc_key及约定好的算法进行加密解密。

    这里客户端与服务器互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。另外,HTTPS一般使用的加密与HASH算法如下:非对称加密算法:RSA,DSA/DSS对称加密算法:AES,RC4,3DESHASH算法:MD5,SHA1,SHA256其中非对称加密算法用于在握手过程中加密生成的密码,对称加密算法用于对真正传输的数据进行加密,而HASH算法用于验证数据的完整性。由于浏览器生成的密码是整个数据加密的关键,因此在传输的时候使用了非对称加密算法对其加密。非对称加密算法会生成公钥和私钥,公钥只能用于加密数据,因此可以随意传输,而服务器的私钥用于对数据进行解密,所以服务器都会非常小心的保管自己的私钥,防止泄漏。

    作者:隋胖胖LoveFat
    链接:http://www.jianshu.com/p/54dd21c50f21
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    我们一般使用 AES 256 对内容做加密,这里 AES 密钥的管理也有两种方式,其一是在客户端使用固定的密钥,为了加大破解的难度,我们可以对密钥本身做多次加密处理,使用时再在内存里解密出来真正的密钥。其二是每次会话都使用不同的密钥,原理类似 Forward Secrecy,即使流量被记录,将来被暴力破解,也能极大的增加攻击者破解的时间成本。

    http://mrpeak.cn/blog/https-mitm/

    https原理:证书传递、验证和数据加密、解密过程解析

    1.浏览器将自己支持的一套加密规则发送给网站。 
    2.网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器
    。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。 
    3.浏览器获得网站证书之后浏览器要做以下工作: 
    a) 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。 
    b) 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。 
    c) 使用约定好的HASH算法计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。 
    4.网站接收浏览器发来的数据之后要做以下的操作: 
    a) 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。 
    b) 使用密码加密一段握手消息,发送给浏览器。 
    5.浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密

    http://blog.csdn.net/clh604/article/details/22179907

  • 相关阅读:
    MongoDB-JAVA-Driver 3.2版本常用代码全整理(4)
    MongoDB-JAVA-Driver 3.2版本常用代码全整理(3)
    MongoDB-JAVA-Driver 3.2版本常用代码全整理(2)
    MongoDB-JAVA-Driver 3.2版本常用代码全整理(1)
    c++清除输入缓冲区之 sync() vs ignore()
    typedef 类型重命名 和 #define 宏定义(1)
    从gcc的__attribute__((packed))聊到结构体大小的问题
    对于volatile的理解
    把一个string串的所有小写字母转成大写字母的例子来看看看全局函数的使用
    string与char* 互相转换以及周边问题
  • 原文地址:https://www.cnblogs.com/dengchaojie/p/7646956.html
Copyright © 2011-2022 走看看