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 基础篇1 什么是js 建立第一个js程序
Mar 14 Javascript
javascript 获取元素样式必杀技
May 04 Javascript
使用angular写一个hello world
Jan 23 Javascript
javascript作用域问题实例分析
Jul 13 Javascript
jQuery实现默认是闭合的FAQ展开效果菜单
Sep 14 Javascript
js确认框confirm()用法实例详解
Jan 07 Javascript
js简单时间比较的方法
Aug 02 Javascript
HTML Table 空白单元格补全的简单实现
Oct 13 Javascript
Bootstrap布局之栅格系统学习笔记
May 04 Javascript
AngularJS日期格式化常见操作实例分析
May 17 Javascript
JS实现前端页面的搜索功能
Jun 12 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
Sep 06 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
PHP中spl_autoload_register函数的用法总结
2013/11/07 PHP
PHP入门教程之面向对象基本概念实例分析
2016/09/11 PHP
zend框架实现支持sql server的操作方法
2016/12/08 PHP
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
jQuery 数据缓存data(name, value)详解及实现
2010/01/04 Javascript
30个最佳jQuery Lightbox效果插件分享
2011/04/11 Javascript
图片img的src不变让浏览器重新加载实现方法
2013/03/29 Javascript
jQuery实现带延迟效果的滑动菜单代码
2015/09/02 Javascript
JS实现获取剪贴板内容的方法
2016/06/21 Javascript
jQuery获取this当前对象子元素对象的方法
2016/11/29 Javascript
H5上传本地图片并预览功能
2017/05/08 Javascript
js装饰设计模式学习心得
2018/02/17 Javascript
微信小程序通过保存图片分享到朋友圈功能
2018/05/24 Javascript
详解Nodejs get获取远程服务器接口数据
2019/03/26 NodeJs
亲自动手实现vue日历控件
2019/06/26 Javascript
vue2 拖动排序 vuedraggable组件的实现
2019/08/08 Javascript
Python读写Excel文件方法介绍
2014/11/22 Python
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
Linux RedHat下安装Python2.7开发环境
2017/05/20 Python
python3 读取Excel表格中的数据
2018/10/16 Python
Python3之外部文件调用Django程序操作model等文件实现方式
2020/04/07 Python
Python中实现输入一个整数的案例
2020/05/03 Python
python热力图实现简单方法
2021/01/29 Python
canvas像素点操作之视频绿幕抠图
2018/09/11 HTML / CSS
英国最红的高街时尚品牌:Topshop
2016/08/05 全球购物
介绍一下.net和Java的特点和区别
2012/09/26 面试题
社区志愿者心得体会
2014/01/03 职场文书
教师群众路线剖析材料
2014/09/29 职场文书
会计师事务所实习证明
2014/11/16 职场文书
开幕式邀请函
2015/01/31 职场文书
博物馆观后感
2015/06/05 职场文书
单位更名证明
2015/06/18 职场文书
你为什么是穷人?可能是这5个缺点造成
2019/07/11 职场文书
python基础之匿名函数详解
2021/04/21 Python
Golang 链表的学习和使用
2022/04/19 Golang
解决spring.thymeleaf.cache=false不起作用的问题
2022/06/10 Java/Android