DH密钥交换算法:DH的全称为Diffie-Hellman ,该算法可以在需要安全传输的前提下,确定双方的对称密钥,该算法的核心在于双方的私钥没有进入网络传输流程,根据对方的公钥和己方的私钥,可以计算出同样的Key。攻击方即便获取到了公钥和P,G值,也无法计算出Key值。
公钥:会进入网络传输的密钥部分,该部分是公开的。
私钥: 由端自己保存的密钥部分,该部分不允许公开。
DK:加密算法中,用X对敏感数据进行加密后,再用Key对X加密得到DK,然后X就被舍弃了,这里的X没有持久化,使用完内存就被销毁,攻击者需要得到敏感数据,就必须得到X,然后X已经被销毁了,破解方必须通过DK去破解出X,DK是通过Key来保护的,只要保证Key是安全的,敏感数据就是安全的。
Key:通过对方公钥和己方私钥生成的Key值,只要私钥不被破解,该值就是安全的。
Token认证:接口的安全认证
SID:握手标识,由客户端生成,用户A和用户B握手后,双方需要记录握手成功后的SID和DH密钥交换中生成的Key。后续通信时,服务端通过请求header中的SID和DK来知道该如何解密敏感信息。
十六进制编码:字节在传输过程中,如果使用一般的编码,会导致网络传输后出现丢失字节的情况,这时就要使用到十六进制编码,在本文中,统一用S(byte[])来标示字符数组的十六进制编码处理。
AES-supports: 加密用的规则,请求方所支持的AES加密种类,如果支持多个,用分号分割。平台内支持的规则是固定的,由库中决定。
AES-param: 响应方从请求方的AES-supports挑选一个随机的加密方法,作为本次加密使用的AES规则。

A.预备知识
整个加密流程的实现,分成客户端部分和服务端部分,对于大部分的服务,均需实现。传输加密前,双方需要通过协商,来确定加密敏感信息所用的密钥。每一次的协商,都会生成一个唯一的SID,用于双方后续的通信。当服务端发现SID过期时,需要返回约定好的错误码,让客户端重新发起协商和请求。
本文以流程为主,代码为辅,介绍了整个流程中的执行细节。为了保证流程的完整性,这里轮流写客户端和服务端的流程。
B.客户端协商请求
P1.客户端生成P,G,PublicKeyA和PrivateKeyA。 P和G生成时均为BigInteger,需要调用方法toString(16)转化成字符串,后面使用的都是转换后的P和G。
P2.客户端生成一个唯一的会话ID,记为SID
P3.客户端生成客户端支持的加/解密规则AES-supports。
P4.客户端生成请求接口用的认证Token,Token的签名使用:
SID + S(publicKey1) + P + G
P5.客户端将Token放入header中,将P、G、S(PublicKeyA)、SID、AES-supports字段放入body中,并调用服务端的协商接口。详细的参数信息见下表:
  
C.服务端协商处理
P1.服务端收到客户端的协商请求后,首先要校验字段的完整性。
P2.通过完整性校验后,校验Token的有效性,其中签名同为:
SID + PublicKey + P + G
所有参数均为请求中的字段
P3.服务端对PublicKey十六进制解码得到PublicKeyA。
P4.服务端通过P,G,PublicKeyA,生成自己的PublicKeyB和PrivateKeyB
P5.服务端从AES-supports中,选择一个作为本地协商的加密规则AES-param
P6.服务端生成一个协商有效时间expireTime(单位、毫秒),并缓存PublicKeyA、PublicKeyB、PrivateKeyB、expireTime、SecuSID、AES-param。
P7.服务端生成一个双向认证用的Token,Token的签名如下:
SecuSID + S(PublicKeyB) + AES-param + expireTime
P7.返回协商结果。
D.客户端协商返回处理
P1.服务端的请求返回的字段对象见下: 
P2.客户端校验服务端生成的Token,校验用的签名如下:
SecuSID + PublicKey + AES-param + expireTime
以上参数均为请求返回的字段。
P3.客户端缓存下这些参数以及之前生成的P、G,其中expireTime决定了会话的过期时间,通过服务端返回的PublicKey十六进制解码后得到的PublicKeyB和之前生成的PrivateKeyA、P、G、本地加密规则AES-param,可以生成Key用于加密。SecuSID在后续数据传输中使用。
至此,握手结束。
E.客户端数据传输请求
P1.客户端先在本地查找是否有和该地址的该服务有握手记录,如果有且记录未过期,则使用该握手记录中的握手数据,否则重新握手。
P2. 客户端根据握手数据中服务端的PublicKeyB、本地的PrivateKeyA和本地加密规则AES- param,生成加密矢量localIv和加密密钥localKey。
P3.客户端生成随机数X,用X和加密矢量localIv、本地加密规则AES- param对请求body中的敏感信息加密得到A,再对A进行Base64加密得到最终用于传输的密文。
P4.客户端用加密矢量localIv、加密密钥localKey和本地加密规则AES- param对随机数X加密得到Y,并对Y进行十六进制编码得到DK。
P5.客户端生成认证Token,生成Token的签名如下:
SID + DK
P6.客户端向服务端发起请求,请求字段如下:

F.服务端数据传输处理
P1.服务端接受到客户端的请求,先校验Header中字段的完整性,
P2.服务端校验客户端请求Token的合法性,其中Token的签名如下:
SecuSID + SecuDK
P3.服务端判断该SecuSID对应的协商是否过期,如果过期,直接返回提示重新握手。
P4.服务端从该SecuSID对应的缓存中,取出之前协商的数据,通过其中的PublicKeyA和PrivateKeyB和客户端的加密规则AES-param,生成加密矢量localIv和加密密钥localKey。
P5.通过对SecuDK十六进制解码得到Y,再通过加密矢量localIv和加密密钥localKey以及客户端的加密规则AES- param对Y进行解密得到X。
P6.对body中的敏感信息密文进行Base64解密得到A,再通过对X和加密矢量localIv对A进行解密得到明文。
P7.业务处理,进入返回敏感信息加密流程。
P8.服务端端生成随机数X,用X和加密矢量localIv、服务端的加密规则AES-param对范围报文中的敏感信息加密得到A,再对A进行Base64加密得到最终用于传输的密文。
P9.服务端用加密矢量localIv、加密密钥localKey和服务端的加密规则AES-param对随机数X加密得到Y,并对Y进行十六进制编码得到DK。
P10.服务端生成认证Token,生成Token的签名如下:
SID + DK
    P11。服务端返回结果。
G.客户端数据传输返回处理
P1. 服务端的请求返回的字段对象见下:
 
 
P2.注意服务端返回的SecuDK和请求过去的SecuDK是不相同的,不能混淆。
P3.校验Token的合法性,校验规则中的签名如下:
SID + DK(服务端返回的)
P4.客户端先对DK用十六进制反编码出Y,再用加密矢量localIv、加密密钥localKey和之前协商返回的服务端加密规则AES-param对Y解密得到X。
P5. 客户端先对传输过来的敏感信息密文用base64解码成字节串,再用X和加密矢量localIv、服务端加密规则AES-param对该字节串解密出明文。

DH密钥交换算法的更多相关文章

  1. DH 密钥交换算法

    1.引言 CSDN搞什么短信验证,7年的账号居然登陆不了,真心抓狂,WTF!!!! DH,全称为"Diffie-Hellman",这是一种确保共享KEY安全穿越不安全网络的方法,换 ...

  2. 短URL DH 密钥交换算法

    w  追问:0-短URL 的时效性,(比如微信个人账户的永久二维码和群的约7天时效二维码):1-0中的时效性对于算法选择的影响,比如简单的HAS映射.sha1.md5......   https:// ...

  3. DH密钥交换协议

    密钥交换 密钥交换简单点来说就是允许两名用户在公开媒体上交换信息以生成"一致"的.可以共享的密钥.也就是由甲方产出一对密钥(公钥.私钥),乙方依照甲方公钥产生乙方密钥对(公钥.私钥 ...

  4. Diffie-Hellman密钥交换算法

    Diffie-Hellman密钥交换算法 之前做过的一个项目中用过DH算法(Diffie-Hellman),这种密钥交换技术的目的在于使得两个用户安全地交换一个共享密钥(shared secret)以 ...

  5. 转: DH密钥交换和ECDH原理

    转自:http://www.tuicool.com/articles/em6zEb DH密钥交换和ECDH原理 时间 2013-06-24 18:50:55  CSDN博客 原文  http://bl ...

  6. Nodejs进阶:使用DiffieHellman密钥交换算法

    ## 简介 Diffie-Hellman(简称DH)是密钥交换算法之一,它的作用是保证通信双方在非安全的信道中安全地交换密钥.目前DH最重要的应用场景之一,就是在HTTPS的握手阶段,客户端.服务端利 ...

  7. DH密钥交换和ECDH原理(转)

    DH密钥交换和ECDH原理 时间 2013-06-24 18:50:55 CSDN博客相似文章 (0) 原文  http://blog.csdn.net/sudochen/article/detail ...

  8. 廖雪峰Java10加密与安全-4加密算法-4密钥交换算法

    1DH算法 1.1.原根公式:g^i mod P 条件:1<g<P,0<i<P 原根:介于[1, p-1]之间的任意2个数i,j(p为素数,i≠j)的结果不相等,即 g^i m ...

  9. 图解 ECDHE 密钥交换算法

    HTTPS 常用的密钥交换算法有两种,分别是 RSA 和 ECDHE 算法. 其中,RSA 是比较传统的密钥交换算法,它不具备前向安全的性质,因此现在很少服务器使用的.而 ECDHE 算法具有前向安全 ...

随机推荐

  1. 在shell脚本中执行shell脚本

    任务下发 主节点脚本 任务管控脚本 [root@admin1 ~]# cat mytest.sh echo lovecode [root@admin1 ~]# cat myfor.sh #!/bin/ ...

  2. Bootstrap button源码分析

    /* ======================================================================== * Bootstrap: button.js v ...

  3. Maven环境配置及命令行打包

    一配置环境变量 下载 apache-maven-3.2.5压缩包解压到本地  F:\apache-maven-3.2.5 配置MAVEN_HOME环境变量F:\apache-maven-3.2.5如图 ...

  4. MAMP/xampp安装redis

    nmp/amp/xampp安装redis 一.安装redis服务 1.通过homebrew安装redis sudo brew install redis 2.启动redis服务,且接受客户端连接 su ...

  5. hdnoip2017

    T1: 小喵喵有 n 个小鱼干排成一列,其中第 i个小鱼干有两种属性,美味度 ai 和特殊度 bi 现在小喵喵要吃掉一些小鱼干,出于一些原因,小喵喵会吃掉连续的一段区间中的所有小鱼干. 如果吃掉了 [ ...

  6. Could not find modernizr-2.6.2 in any of the sources

  7. 微信小程序获取自定义属性值

    写小程序的时候用到了自定义属性,特地来记录一下 特别是这个坑,必须得说一说 wxml <view class='box' bindtap='getValue'> <view clas ...

  8. Windows 和 Linux 上Redis的安装守护进程配置

    # Windows 和 Linux 上Redis的安装守护进程配置 Redis 简介 ​ Redis是目前最常用的非关系型数据库(NOSql)之一,常以Key-Value的形式存储.Redis读写速度 ...

  9. SQL 设置登录名和密码

    1.打开SQL Server Manager管理器,在左面找到 ‘安全性’ 单击右键 选择‘新建”->“登录”, 如下图 2.弹出对话框,在登录名中输入你的登录号,选择'SQLSERVER身份验 ...

  10. 图片预览------photoswipe 使用

    photoswipe 使用 预览图片后,需要点击关闭按钮才能关闭,点击图片事件效果是放大图片,和微信的效果不一致,最后改用微信预览图片的接口了,但是例子可以用,记录一下!! http://www.cn ...