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 相关文章推荐
iframe 自适应高度[在IE6 IE7 FF下测试通过]
Apr 13 Javascript
JavaScript.The.Good.Parts阅读笔记(二)作用域&闭包&减缓全局空间污染
Nov 16 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
Nov 17 Javascript
jQuery的链式调用浅析
Dec 03 Javascript
jquery动态加载js三种方法实例
Aug 03 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
Jan 09 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
Mar 26 Javascript
node.js中的http.response.removeHeader方法使用说明
Dec 14 Javascript
详解jQuery中的deferred对象的使用(一)
May 27 Javascript
vue mint-ui 实现省市区街道4级联动示例(仿淘宝京东收货地址4级联动)
Oct 16 Javascript
解决bootstrap模态框数据缓存的问题方法
Aug 10 Javascript
Openlayers实现地图的基本操作
Sep 28 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
实时抓取YAHOO股票报价的代码
2006/10/09 PHP
phpfans留言版用到的数据操作类和分页类
2007/01/04 PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
2014/03/12 PHP
关于PHP中协程和阻塞的一些理解与思考
2017/08/11 PHP
CI框架网页缓存简单用法分析
2018/12/26 PHP
仿百度的关键词匹配搜索示例
2013/09/25 Javascript
JavaScript设置首页和收藏页面的小例子
2013/11/11 Javascript
分享一则javascript 调试技巧
2015/01/02 Javascript
js用拖动滑块来控制图片大小的方法
2015/02/27 Javascript
详解javascript实现瀑布流列式布局
2016/01/29 Javascript
js组件SlotMachine实现图片切换效果制作抽奖系统
2016/04/17 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
解决nodejs的npm命令无反应的问题
2018/05/17 NodeJs
vue中 v-for循环的用法详解
2020/02/19 Javascript
解决vue做详情页跳转的时候使用created方法 数据不会更新问题
2020/07/24 Javascript
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
对pandas中to_dict的用法详解
2018/06/05 Python
python使用tornado实现简单爬虫
2018/07/28 Python
pygame游戏之旅 添加icon和bgm音效的方法
2018/11/21 Python
Python中xml和json格式相互转换操作示例
2018/12/05 Python
Python实现猜年龄游戏代码实例
2020/03/25 Python
使用python实现时间序列白噪声检验方式
2020/06/03 Python
详解Python3 定义一个跨越多行的字符串的多种方法
2020/09/06 Python
CSS3中媒体查询结合rem布局适配手机屏幕
2019/06/10 HTML / CSS
Java如何读取CLOB字段
2013/10/10 面试题
美术专业个人自我评价
2014/01/18 职场文书
个人简历自我评价
2014/02/02 职场文书
年终总结会议主持词
2014/03/17 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
药品业务员岗位职责
2014/04/17 职场文书
爱我中华演讲稿
2014/05/20 职场文书
2014年大学生村官工作总结
2014/11/19 职场文书
学校元旦晚会开场白
2014/12/14 职场文书
教师工作表现自我评价
2015/03/05 职场文书
MySQL中order by的执行过程
2022/06/05 MySQL