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 相关文章推荐
js 代码集(学习js的朋友可以看下)
Jul 22 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
Oct 26 Javascript
基于HTML+CSS+JS实现增加删除修改tab导航特效代码
Aug 05 Javascript
详解如何较好的使用js
Dec 16 Javascript
在使用JSON格式处理数据时应该注意的问题小结
May 20 Javascript
js链表操作(实例讲解)
Aug 29 Javascript
laravel5.4+vue+element简单搭建的示例代码
Aug 29 Javascript
jQuery实现新闻播报滚动及淡入淡出效果示例
Mar 23 jQuery
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
May 17 Javascript
javascript实现函数柯里化与反柯里化过程解析
Oct 08 Javascript
vue项目强制清除页面缓存的例子
Nov 06 Javascript
使用vue引入maptalks地图及聚合效果的实现
Aug 10 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
怎么使 Mysql 数据同步
2006/10/09 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
2013/06/28 PHP
php function用法如何递归及return和echo区别
2014/03/07 PHP
PHP实现ftp上传文件示例
2014/08/21 PHP
Laravel find in set排序实例
2019/10/09 PHP
如何在JavaScript中实现私有属性的写类方式(二)
2013/12/04 Javascript
javascript中数组的定义及使用实例
2015/01/21 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
AngularJS实现动态编译添加到dom中的方法
2016/11/04 Javascript
功能强大的jquery.validate表单验证插件
2016/11/07 Javascript
JavaScript实现瀑布流以及加载效果
2017/02/11 Javascript
纯JS实现轮播图
2017/02/22 Javascript
[js高手之路]寄生组合式继承的优势详解
2017/08/28 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
使用webpack-dev-server处理跨域请求的方法
2018/04/18 Javascript
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
JQuery的加载和选择器用法简单示例
2019/05/13 jQuery
分享一款超好用的JavaScript 打包压缩工具
2020/04/26 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
2020/07/26 Javascript
[01:13:46]iG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
在Django框架中伪造捕捉到的URLconf值的方法
2015/07/18 Python
Python之Web框架Django项目搭建全过程
2017/05/02 Python
python实现生命游戏的示例代码(Game of Life)
2018/01/24 Python
python使用tensorflow保存、加载和使用模型的方法
2018/01/31 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
2018/04/10 Python
Python实现多级目录压缩与解压文件的方法
2018/09/01 Python
css3类选择器之结合元素选择器和多类选择器用法
2017/03/09 HTML / CSS
下面关于"联合"的题目的输出是什么
2013/08/06 面试题
使用索引有什么好处
2016/07/27 面试题
什么情况下你必须要把一个类定义为abstract的
2013/01/06 面试题
教育科学研究生自荐信
2013/10/09 职场文书
保密承诺书范文
2014/03/27 职场文书
工商管理专业毕业生求职信
2014/05/26 职场文书
党员批评与自我批评发言稿
2014/10/14 职场文书
地道战观后感300字
2015/06/04 职场文书