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触发器详解
Mar 10 Javascript
js 数组的for循环到底应该怎么写?
May 31 Javascript
jQuery EasyUI API 中文文档 可调整尺寸
Sep 29 Javascript
jQuery获取注册信息并提示实现代码
Apr 21 Javascript
javascript判断非数字的简单例子
Jul 18 Javascript
js转义字符介绍
Nov 05 Javascript
基于Jquery实现万圣节快乐特效
Nov 01 Javascript
深入理解JavaScript中的并行处理
Sep 22 Javascript
微信小程序-拍照或选择图片并上传文件
Jan 06 Javascript
无法获取隐藏元素宽度和高度的解决方案
Mar 07 Javascript
vue 实现左右拖拽元素并且不超过他的父元素的宽度
Nov 30 Javascript
JavaScript实现简单进度条效果
Mar 25 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
什么是MVC,好东西啊
2007/05/03 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
Yii2超好用的日期和时间组件(值得收藏)
2016/05/05 PHP
PHP调用Mailgun发送邮件的方法
2017/05/04 PHP
top.location.href 没有权限 解决方法
2008/08/05 Javascript
jQuery下的几个你可能没用过的功能
2010/08/29 Javascript
JS小功能(setInterval实现图片效果显示时间)实例代码
2013/11/28 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
如何解决easyui自定义标签 datagrid edit combobox 手动输入保存不上
2015/12/26 Javascript
ajax跨域调用webservice的实现代码
2016/05/09 Javascript
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
简单模拟node.js中require的加载机制
2016/10/27 Javascript
微信小程序 扎金花简单实例
2017/02/21 Javascript
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
mui框架移动开发初体验详解
2017/10/11 Javascript
vue 实现左右拖拽元素并且不超过他的父元素的宽度
2018/11/30 Javascript
Echart折线图手柄触发事件示例详解
2018/12/16 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
使用apifm-wxapi快速开发小程序过程详解
2019/08/05 Javascript
jQuery+ajax实现用户登录验证
2020/09/13 jQuery
python利用dir函数查看类中所有成员函数示例代码
2017/09/08 Python
Python中三元表达式的几种写法介绍
2019/03/04 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
快速创建python 虚拟环境
2020/11/28 Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
2020/12/13 Python
求职推荐信
2013/10/28 职场文书
商务专员岗位职责
2013/11/23 职场文书
机电专业大学生职业规划书范文
2014/02/25 职场文书
库房保管员岗位职责
2014/04/07 职场文书
高效课堂标语
2014/06/26 职场文书
公司自我介绍演讲稿
2014/08/21 职场文书
学校证明范文
2015/06/24 职场文书
接收函
2019/04/22 职场文书
MySQL的Query Cache图文详解
2021/07/01 MySQL
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB
Three.js实现雪糕地球的使用示例详解
2022/07/07 Javascript