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 UI-Draggable 参数集合
Jan 10 Javascript
比Jquery的document.ready更快的方法
Apr 28 Javascript
javascript题目,重写函数让其无限相加
Feb 15 Javascript
html+css+js实现xp window界面及有关功能
Mar 26 Javascript
js switch case default 的用法示例介绍
Oct 23 Javascript
jquery动态添加option示例
Dec 30 Javascript
jQuery多项选项卡的实现思路附样式及代码
Jun 03 Javascript
JS实现图片产生波纹一样flash效果的方法
Feb 27 Javascript
JS实现从连接中获取youtube的key实例
Jul 02 Javascript
ES6中Class类的静态方法实例小结
Oct 28 Javascript
vue实现商品加减计算总价的实例代码
Aug 12 Javascript
vue2.x数组劫持原理的实现
Apr 19 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
AeroWindow 基于JQuery的弹出窗口插件
2011/06/27 Javascript
JavaScript移除数组元素减少长度的方法
2013/09/05 Javascript
jQuery中fadeOut()方法用法实例
2014/12/24 Javascript
js+CSS实现弹出居中背景半透明div层的方法
2015/02/26 Javascript
jquery判断至少有一个checkbox被选中的方法
2015/06/05 Javascript
jQuery编程中的一些核心方法简介
2015/08/14 Javascript
JS实现的竖向折叠菜单代码
2015/10/21 Javascript
bootstrap模态框消失问题的解决方法
2016/12/02 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
vue用addRoutes实现动态路由的示例
2017/09/15 Javascript
vue 简单自动补全的输入框的示例
2018/03/12 Javascript
解决vue-cli + webpack 新建项目出错的问题
2018/03/20 Javascript
[01:19:11]Ti4 循环赛第二日 NaVi.us vs iG
2014/07/11 DOTA
[45:16]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第一场 12.12
2020/12/16 DOTA
Python中的单行、多行、中文注释方法
2018/07/19 Python
Python3的socket使用方法详解
2020/02/18 Python
python手机号前7位归属地爬虫代码实例
2020/03/31 Python
Python实现封装打包自己写的代码,被python import
2020/07/12 Python
纯CSS3制作的鼠标悬停时边框旋转
2017/01/03 HTML / CSS
Fashion Eyewear美国:英国线上设计师眼镜和太阳镜的零售商
2016/08/15 全球购物
英国男士时尚购物网站:Stuarts London
2017/10/22 全球购物
女士时装鞋:Chinese Laundry
2018/08/29 全球购物
台湾全方位线上课程与职能学习平台:TibaMe
2019/12/04 全球购物
银行会计业务的个人自我评价
2013/11/02 职场文书
高中学生干部学习的自我评价
2014/02/21 职场文书
预备党员承诺书
2014/03/25 职场文书
《路旁的橡树》教学反思
2014/04/07 职场文书
募捐倡议书
2014/04/14 职场文书
推广普通话标语
2014/06/27 职场文书
初三学生语文考试作弊检讨书
2014/12/14 职场文书
孔庙导游词
2015/02/04 职场文书
公司优秀员工推荐信
2015/03/24 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书
如何判断微信付款码和支付宝付款码
2021/04/01 PHP
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python
使用redis实现延迟通知功能(Redis过期键通知)
2021/09/04 Redis