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 相关文章推荐
Jquery Ajax.ashx 高效分页实现代码
Oct 20 Javascript
妙用Jquery的val()方法
Jun 27 Javascript
jQuery寻找n以内完全数的方法
Jun 24 Javascript
基于JQuery实现分隔条的功能
Jun 17 Javascript
javascript特殊文本输入框网页特效
Sep 13 Javascript
12 款 JS 代码测试必备工具(翻译)
Dec 13 Javascript
如何解决jQuery EasyUI 已打开Tab重新加载问题
Dec 19 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
Sep 15 Javascript
JSON是什么?有哪些优点?JSON和XML的区别?
Apr 29 Javascript
Node 搭建一个静态资源服务器的实现
May 20 Javascript
Element DateTimePicker日期时间选择器的使用示例
Jul 27 Javascript
JavaScript实现点击切换功能
Jan 27 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实现的RSS生成类实例
2015/04/23 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
在IE6下发生Internet Explorer cannot open the Internet site错误
2010/06/21 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
基于Jquery与WebMethod投票功能实现代码
2011/01/19 Javascript
js自定义事件及事件交互原理概述(二)
2013/02/01 Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
2014/09/01 Javascript
node.js中的http.response.writeHead方法使用说明
2014/12/14 Javascript
Javascript中实现trim()函数的两种方法
2015/02/04 Javascript
JQuery+CSS实现图片上放置按钮的方法
2015/05/29 Javascript
js实现点击切换TAB标签实例
2015/08/21 Javascript
JavaScrip常见的一些算法总结
2015/12/28 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
简单实现js页面切换功能
2021/01/10 Javascript
Angular在一个页面中使用两个ng-app的方法
2017/02/20 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
2017/07/17 jQuery
如何抽象一个Vue公共组件
2017/10/17 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
react.js组件实现拖拽复制和可排序的示例代码
2018/08/20 Javascript
VUE基于NUXT的SSR 服务端渲染
2018/11/30 Javascript
微信小程序常用简易小函数总结
2019/02/01 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
Python实现递归遍历文件夹并删除文件
2016/04/18 Python
python email smtplib模块发送邮件代码实例
2018/04/26 Python
python组合无重复三位数的实例
2018/11/13 Python
python爬虫库scrapy简单使用实例详解
2020/02/10 Python
python+opencv边缘提取与各函数参数解析
2020/03/09 Python
解决python执行较大excel文件openpyxl慢问题
2020/05/15 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
幼儿园小班教学反思
2014/02/02 职场文书
转让协议书范本
2014/09/13 职场文书
婚礼伴郎致辞
2015/07/28 职场文书
2016年寒假生活小结
2015/10/10 职场文书
拥有这5个特征人,“命”都不会太差
2019/08/16 职场文书
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电