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学习笔记(二) js对象
Oct 25 Javascript
Flex通过JS获取客户端IP和计算机名的实例代码
Nov 21 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
Mar 04 Javascript
Jquery注册事件实现方法
May 18 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
Sep 09 Javascript
jquery.cookie实现的客户端购物车操作实例
Dec 24 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
Aug 10 Javascript
select隐藏选中值对应的id,显示其它id的简单实现方法
Aug 25 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
Jan 15 Javascript
js的新生代垃圾回收知识点总结
Aug 22 Javascript
Vuex,iView UI面包屑导航使用扩展详解
Nov 04 Javascript
详解Vue Cli浏览器兼容性实践
Jun 08 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中字符串长度的截取用法示例
2017/01/12 PHP
php实现二叉树中和为某一值的路径方法
2018/10/14 PHP
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
2010/06/19 Javascript
NodeJs中的非阻塞方法介绍
2012/06/05 NodeJs
js实现兼容IE和FF的上下层的移动
2015/05/04 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
利用jsonp与代理服务器方案解决跨域问题
2017/09/14 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
2017/10/17 Javascript
详解RequireJs官方使用教程
2017/10/31 Javascript
vue中axios请求的封装实例代码
2019/03/23 Javascript
详解es6新增数组方法简便了哪些操作
2019/05/09 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
[05:37]DOTA2-DPC中国联赛 正赛 Elephant vs iG 选手采访
2021/03/11 DOTA
从零学Python之入门(四)运算
2014/05/27 Python
python利用beautifulSoup实现爬虫
2014/09/29 Python
用ReactJS和Python的Flask框架编写留言板的代码示例
2015/12/19 Python
python实现杨氏矩阵查找
2019/03/02 Python
dpn网络的pytorch实现方式
2020/01/14 Python
手把手教你进行Python虚拟环境配置教程
2020/02/03 Python
python爬虫搭配起Bilibili唧唧的流程分析
2020/12/01 Python
Python+kivy BoxLayout布局示例代码详解
2020/12/28 Python
纯CSS3代码实现switch滑动开关按钮效果
2016/08/30 HTML / CSS
DJI大疆无人机官方商城:全球领先的无人飞行器研发和生产商
2016/12/21 全球购物
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
卫校护理专业毕业生求职信
2013/11/26 职场文书
通信工程专业毕业生推荐信
2013/12/25 职场文书
超市总经理岗位职责
2014/02/02 职场文书
应聘教师自荐书
2014/06/16 职场文书
祖国在我心中演讲稿200字
2014/08/28 职场文书
2014年班长个人工作总结
2014/11/14 职场文书
公司开会通知
2015/04/20 职场文书
pytorch中的model.eval()和BN层的使用
2021/05/22 Python
MySQL索引失效的典型案例
2021/06/05 MySQL
一文了解Java动态代理的原理及实现
2022/07/07 Java/Android