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.Treeview添加右键菜单的实现代码
Oct 22 Javascript
JavaScript中数组的排序、乱序和搜索实现代码
Nov 30 Javascript
js快速排序的实现代码
Dec 08 Javascript
javascript实现的右下角弹窗实例
Apr 24 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
Oct 22 Javascript
深入理解Angular2 模板语法
Aug 07 Javascript
BootStrap modal模态弹窗使用小结
Oct 26 Javascript
遍历js中对象的属性和值的实例
Nov 21 Javascript
jQuery的ztree仿windows文件新建和拖拽功能的实现代码
Dec 05 jQuery
Layui实现主窗口和Iframe层参数传递
Nov 14 Javascript
微信小程序报错: thirdScriptError的错误问题
Jun 19 Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
Sep 21 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 和 HTML
2006/10/09 PHP
使用PHP模拟HTTP认证
2006/10/09 PHP
用PHP制作静态网站的模板框架(一)
2006/10/09 PHP
PHP实现定时生成HTML网站首页实例代码
2008/11/20 PHP
php快递单号查询接口使用示例
2014/05/05 PHP
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例
2016/04/14 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
javascript中利用数组实现的循环队列代码
2010/01/24 Javascript
FileUpload 控件 禁止手动输入或粘贴的实现代码
2010/04/07 Javascript
常规表格多表头查询示例
2014/02/21 Javascript
JavaScript用JQuery呼叫Server端方法示例代码
2014/09/03 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
jQuery基础知识点总结(DOM操作)
2016/06/01 Javascript
半个小时学json(json传递示例)
2016/12/25 Javascript
prototype与__proto__区别详细介绍
2017/01/09 Javascript
js制作简单的音乐播放器的示例代码
2017/08/28 Javascript
Webpack的dll功能使用
2018/06/28 Javascript
对Vue.js之事件的绑定(v-on: 或者 @ )详解
2018/09/15 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
2020/06/24 Javascript
vue二选一tab栏切换新做法实现
2021/01/19 Vue.js
[42:32]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第二场 10.28
2020/10/28 DOTA
python设置windows桌面壁纸的实现代码
2013/01/28 Python
Python实现把回车符\r\n转换成\n
2015/04/23 Python
使用python实现快速搭建简易的FTP服务器
2018/09/12 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
Python爬虫动态ip代理防止被封的方法
2019/07/07 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
PyCharm上安装Package的实现(以pandas为例)
2020/09/18 Python
教师自我鉴定范文
2013/11/10 职场文书
辞职信怎么写
2015/02/27 职场文书
2015年英语教研组工作总结
2015/05/23 职场文书
培训后的感想
2015/08/07 职场文书
MongoDB连接数据库并创建数据等使用方法
2021/11/27 MongoDB
使用Ajax实现无刷新上传文件
2022/04/12 Javascript