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 相关文章推荐
Mootools 1.2教程 选项卡效果(Tabs)
Sep 15 Javascript
node.js Web应用框架Express入门指南
May 28 Javascript
js实现索引图片切换效果
Nov 21 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
Jun 30 Javascript
jQuery组件easyui对话框实现代码
Aug 25 Javascript
Bootstrap CSS组件之下拉菜单(dropdown)
Dec 17 Javascript
利用iscroll4实现轮播图效果实例代码
Jan 11 Javascript
使用JS动态显示文本
Sep 09 Javascript
使用FormData实现上传多个文件
Dec 04 Javascript
ES6 新增的创建数组的方法(小结)
Aug 01 Javascript
javascript 原型与原型链的理解及应用实例分析
Feb 10 Javascript
vue 数字翻牌器动态加载数据
Apr 20 Vue.js
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 fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
2011/05/24 PHP
smarty表格换行实例
2014/12/15 PHP
PHP读取txt文本文件并分页显示的方法
2015/03/11 PHP
PHP中的Trait 特性及作用
2016/04/03 PHP
PHP引用返回用法示例
2016/05/28 PHP
jquery如何实现锚点链接之间的平滑滚动
2013/12/02 Javascript
深入理解javascript作用域和闭包
2014/09/23 Javascript
JavaScript中的ubound函数使用实例
2014/11/04 Javascript
js控制输入框获得和失去焦点时状态显示的方法
2015/01/30 Javascript
原生js模拟淘宝购物车项目实战
2015/11/18 Javascript
不得不知的ES6小技巧
2018/07/28 Javascript
JS函数内部属性之arguments和this实例解析
2018/10/07 Javascript
浅谈vuex actions和mutation的异曲同工
2018/12/13 Javascript
微信小程序实现分享商品海报功能
2019/09/30 Javascript
解决vue项目F5刷新mounted里的函数不执行问题
2019/11/05 Javascript
JavaScript如何借用构造函数继承
2019/11/06 Javascript
理解JavaScript中的Proxy 与 Reflection API
2020/09/21 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
[48:24]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第一场 12.09
2020/12/12 DOTA
[48:31]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第一场 2月2日
2021/03/11 DOTA
简单介绍Python中的round()方法
2015/05/15 Python
在Mac OS上搭建Python的开发环境
2015/12/24 Python
python 字符串转列表 list 出现\ufeff的解决方法
2017/06/22 Python
django项目中新增app的2种实现方法
2020/04/01 Python
Python操作Elasticsearch处理timeout超时
2020/07/17 Python
Django权限控制的使用
2021/01/07 Python
Lacoste美国官网:经典POLO衫品牌
2016/10/12 全球购物
美国汽车性能部件和赛车零件网站:Vivid Racing
2018/03/27 全球购物
美国山地自行车、露营、户外装备和服装购物网站:Aventuron
2018/05/05 全球购物
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
银行竞聘演讲稿
2014/05/16 职场文书
幼儿园园长个人总结
2015/03/02 职场文书
员工担保书范本
2015/09/22 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python
SpringBoot生成License的实现示例
2021/06/16 Java/Android