Node.js如何使用Diffie-Hellman密钥交换算法详解


Posted in Javascript onSeptember 05, 2017

简介

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

下面会先简单介绍DH的数理基础,然后举例说明如何在nodejs中使用DH相关的API。下面话不多说了,来一起看看详细的介绍吧。

数论基础

要理解DH算法,需要掌握一定的数论基础。感兴趣的可以进一步研究推导过程,或者直接记住下面结论,然后进入下一节。

  • 假设 Y = a^X mod p,已知X的情况下,很容易算出Y;已知道Y的情况下,很难算出X;
  • (a^Xa mod p)^Xb mod p = a^(Xa * Xb) mod p

握手步骤说明

假设客户端、服务端挑选两个素数a、p(都公开),然后

  • 客户端:选择自然数Xa,Ya = a^Xa mod p,并将Ya发送给服务端;
  • 服务端:选择自然数Xb,Yb = a^Xb mod p,并将Yb发送给客户端;
  • 客户端:计算 Ka = Yb^Xa mod p
  • 服务端:计算 Kb = Ya^Xb mod p
Ka = Yb^Xa mod p

= (a^Xb mod p)^Xa mod p 
= a^(Xb * Xa) mod p
= (a^Xa mod p)^Xb mod p
= Ya^Xb mod p
= Kb

可以看到,尽管客户端、服务端彼此不知道对方的Xa、Xb,但算出了相等的secret。

Nodejs代码示例

结合前面小结的介绍来看下面代码,其中,要点之一就是client、server采用相同的素数a、p。

var crypto = require('crypto');

var primeLength = 1024; // 素数p的长度
var generator = 5; // 素数a

// 创建客户端的DH实例
var client = crypto.createDiffieHellman(primeLength, generator);
// 产生公、私钥对,Ya = a^Xa mod p
var clientKey = client.generateKeys();

// 创建服务端的DH实例,采用跟客户端相同的素数a、p
var server = crypto.createDiffieHellman(client.getPrime(), client.getGenerator());
// 产生公、私钥对,Yb = a^Xb mod p
var serverKey = server.generateKeys();

// 计算 Ka = Yb^Xa mod p
var clientSecret = client.computeSecret(server.getPublicKey());
// 计算 Kb = Ya^Xb mod p
var serverSecret = server.computeSecret(client.getPublicKey());

// 由于素数p是动态生成的,所以每次打印都不一样
// 但是 clientSecret === serverSecret
console.log(clientSecret.toString('hex'));
console.log(serverSecret.toString('hex'));

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

相关链接

理解 Deffie-Hellman 密钥交换算法

迪菲-赫尔曼密钥交换

Secure messages in NodeJSusing ECDH

Keyless SSL: The Nitty Gritty Technical Details

Javascript 相关文章推荐
JavaScript DOM学习第八章 表单错误提示
Feb 19 Javascript
html的DOM中document对象images集合用法实例
Jan 21 Javascript
jquery使用正则表达式验证email地址的方法
Jan 22 Javascript
Node.js巧妙实现Web应用代码热更新
Oct 22 Javascript
基于jQuery实现交互体验社会化分享代码附源码下载
Jan 04 Javascript
关于微信上网页图片点击全屏放大效果
Dec 19 Javascript
基于Vue实现timepicker
Apr 25 Javascript
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
Jul 22 jQuery
微信小程序wx.request实现后台数据交互功能分析
Nov 25 Javascript
JS在if中的强制类型转换方式
Jul 15 Javascript
js 实现ajax发送步骤过程详解
Jul 25 Javascript
Vue源码分析之Vue实例初始化详解
Aug 25 Javascript
javascript观察者模式实现自动刷新效果
Sep 05 #Javascript
js使用generator函数同步执行ajax任务
Sep 05 #Javascript
vue如何使用 Slot 分发内容实例详解
Sep 05 #Javascript
详解Vue2.0 事件派发与接收
Sep 05 #Javascript
JavaSctit 利用FileReader和滤镜上传图片预览功能
Sep 05 #Javascript
jQuery实现注册会员时密码强度提示信息功能示例
Sep 05 #jQuery
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
Sep 05 #Javascript
You might like
php adodb连接mssql解决乱码问题
2009/06/12 PHP
使用PHP实现微信摇一摇周边红包
2016/01/04 PHP
PHP预定义变量9大超全局数组用法详解
2016/04/23 PHP
javascript 混合的构造函数和原型方式,动态原型方式
2009/12/07 Javascript
iframe 异步加载技术及性能分析
2011/07/19 Javascript
JsDom 编程小结
2011/08/09 Javascript
谈谈JavaScript中的函数与闭包
2013/04/14 Javascript
window.onload和$(function(){})的区别介绍
2013/10/30 Javascript
随鼠标上下滚动的jquery代码
2013/12/05 Javascript
javascript 数字格式化输出的实现代码
2013/12/10 Javascript
jQuery文件上传插件Uploadify使用指南
2014/06/05 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
JavaScript的arguments对象应用示例
2014/09/15 Javascript
JavaScript中的object转换成number或string规则介绍
2014/12/31 Javascript
jQuery中cookie插件用法实例分析
2015/12/04 Javascript
基于jquery实现表格无刷新分页
2016/01/07 Javascript
BootStrap Validator 根据条件在JS中添加或移除校验操作
2017/10/12 Javascript
详解vue项目的构建,打包,发布全过程
2017/11/23 Javascript
JavaScript实现数组全排列、去重及求最大值算法示例
2018/07/30 Javascript
React Router V4使用指南(精讲)
2018/09/17 Javascript
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
JS创建自定义对象的六种方法总结
2020/12/15 Javascript
使用python实现生成用户信息
2017/03/20 Python
Python随机生成手机号、数字的方法详解
2017/07/21 Python
python中 chr unichr ord函数的实例详解
2017/08/06 Python
python和php哪个更适合写爬虫
2020/06/22 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
2020/08/17 Python
Python eval函数介绍及用法
2020/11/09 Python
python 30行代码实现蚂蚁森林自动偷能量
2021/02/08 Python
初中三年毕业生的自我评价分享
2014/02/14 职场文书
副校长竞聘演讲稿
2014/09/01 职场文书
房屋鉴定委托书范本
2014/09/23 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang
在SQL Server中使用 Try Catch 处理异常的示例详解
2022/07/15 SQL Server