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 相关文章推荐
仿百度的关键词匹配搜索示例
Sep 25 Javascript
JavaScript实现的字符串replaceAll函数代码分享
Apr 02 Javascript
vue.js实现仿原生ios时间选择组件实例代码
Dec 21 Javascript
很棒的一组js图片轮播特效
Jan 12 Javascript
浅析vue数据绑定
Jan 17 Javascript
vuejs指令详解
Feb 07 Javascript
jquery单击文字或图片内容放大并居中显示
Jun 23 jQuery
ionic 3.0+ 项目搭建运行环境的教程
Aug 09 Javascript
详解Angular中通过$location获取地址栏的参数
Aug 02 Javascript
vue 使用vue-i18n做全局中英文切换的方法
Oct 29 Javascript
vue项目动态设置页面title及是否缓存页面的问题
Nov 08 Javascript
微信小程序中限制激励式视频广告位显示次数(实现思路)
Dec 06 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
让这部DC动画新作刷新你的认知
2020/03/03 欧美动漫
我的论坛源代码(六)
2006/10/09 PHP
PHP日期函数date格式化UNIX时间的方法
2015/03/19 PHP
深入了解PHP中的Array数组和foreach
2016/11/06 PHP
CSS3画一个阴阳八卦图
2021/03/09 HTML / CSS
图片自动更新(说明)
2006/10/02 Javascript
ScrollDown的基本操作示例
2013/06/09 Javascript
SinaEditor使用方法详解
2013/12/28 Javascript
jquery按回车键实现表单提交的简单实例
2016/05/25 Javascript
AngularJs 动态加载模块和依赖
2016/09/15 Javascript
JS焦点图,JS 多个页面放多个焦点图的实例
2016/12/08 Javascript
JS实现太极旋转思路分析
2016/12/09 Javascript
js实现密码强度检验
2017/01/15 Javascript
javaScript强制保留两位小数的输入数校验和小数保留问题
2018/05/09 Javascript
在Vue中使用axios请求拦截的实现方法
2018/10/25 Javascript
浅谈发布订阅模式与观察者模式
2019/04/09 Javascript
详解iframe跨域的几种常用方法(小结)
2019/04/29 Javascript
vue-form表单验证是否为空值的实例详解
2019/10/29 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
Python中给List添加元素的4种方法分享
2014/11/28 Python
Python打印scrapy蜘蛛抓取树结构的方法
2015/04/08 Python
python简单的函数定义和用法实例
2015/05/07 Python
Python多线程爬虫简单示例
2016/03/04 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
python获取点击的坐标画图形的方法
2019/07/09 Python
python3多线程知识点总结
2019/09/26 Python
Python读取配置文件(config.ini)以及写入配置文件
2020/04/08 Python
解决Python 写文件报错TypeError的问题
2020/10/23 Python
全球最大的跑步用品商店:Road Runner Sports
2016/09/11 全球购物
英国知名小木屋定制网站:Tiger Sheds
2020/03/06 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
2016/08/18 面试题
建筑班组长岗位职责
2014/01/02 职场文书
大学团日活动总结书
2015/05/11 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
暂住证证明
2015/06/19 职场文书
酒店厨房管理制度
2015/08/06 职场文书