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 相关文章推荐
JavaScript操作XML 使用百度RSS作为新闻源示例
Feb 17 Javascript
Js操作Select大全(取值、设置选中等等)
Oct 29 Javascript
减少访问DOM的次数提升javascript性能
Feb 24 Javascript
使用javaScript动态加载Js文件和Css文件
Oct 24 Javascript
javascript html5 canvas实现可拖动省份的中国地图
Mar 11 Javascript
js给table赋值的实例代码
Oct 13 Javascript
Angular.JS中指令ng-if的注意事项小结
Jun 21 Javascript
详解使用Node.js 将txt文件转为Excel文件
Jul 05 Javascript
150行代码带你实现微信小程序中的数据侦听
May 17 Javascript
ant-design-vue 快速避坑指南(推荐)
Jan 21 Javascript
简单了解JS打开url的方法
Feb 21 Javascript
Vue表单提交点击事件只允许点击一次的实例
Oct 23 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
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
2007/03/15 PHP
PHP+MYSQL 出现乱码的解决方法
2008/08/08 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
2013/11/13 PHP
THINKPHP支持YAML配置文件的设置方法
2015/03/17 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
js jquery做的图片连续滚动代码
2008/01/06 Javascript
利用jquery的获取JS文件中的字符串内容
2012/02/14 Javascript
javascript禁用Tab键脚本实例
2013/11/22 Javascript
jquery选择器之层级过滤选择器详解
2014/01/27 Javascript
jQuery中append()方法用法实例
2015/01/08 Javascript
Bootstrap入门书籍之(三)栅格系统
2016/02/17 Javascript
jQuery获得字体颜色16位码的方法
2016/02/20 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
2016/06/03 Javascript
Bootstrap框架实现广告轮播效果
2016/11/28 Javascript
vue自定义过滤器创建和使用方法详解
2017/11/06 Javascript
angularjs 动态从后台获取下拉框的值方法
2018/08/13 Javascript
vue项目持久化存储数据的实现代码
2018/10/01 Javascript
JavaScript创建、读取和删除cookie
2019/09/03 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
Jquery异步上传文件代码实例
2019/11/13 jQuery
简单了解常用的JavaScript 库
2020/07/16 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
用Python写的图片蜘蛛人代码
2012/08/27 Python
python socket 超时设置 errno 10054
2014/07/01 Python
Python中endswith()函数的基本使用
2015/04/07 Python
Python线程条件变量Condition原理解析
2020/01/20 Python
python中类与对象之间的关系详解
2020/12/16 Python
HTML5声音录制/播放功能的实现代码
2018/05/03 HTML / CSS
财务信息服务专业自荐书范文
2014/02/08 职场文书
厨房管理计划书
2014/04/27 职场文书
装修活动策划方案
2014/08/27 职场文书
2014年招商引资工作总结
2014/11/22 职场文书
合理化建议书
2015/02/04 职场文书
礼貌问候语大全
2015/11/10 职场文书
九年级数学教学反思
2016/02/17 职场文书
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server