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中的相等与不等运算
Apr 25 Javascript
初窥JQuery(二)事件机制(2)
Dec 06 Javascript
js 与 php 通过json数据进行通讯示例
Mar 26 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
Oct 17 Javascript
JavaScript实现图片DIV竖向滑动的方法
Apr 25 Javascript
JavaScript中的getDay()方法使用详解
Jun 09 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
Dec 04 Javascript
JS实现改变HTML上文字颜色和内容的方法
Dec 30 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
Dec 09 Javascript
你了解vue3.0响应式数据怎么实现吗
Jun 07 Javascript
微信小程序组件传值图示过程详解
Jul 31 Javascript
ionic2.0双击返回键退出应用
Sep 17 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实现MySQL数据库备份与还原类实例
2014/12/09 PHP
php与Mysql的一些简单的操作
2015/02/26 PHP
php生成图片验证码-附五种验证码
2015/08/19 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
JavaScript入门教程(11) js事件处理
2009/01/31 Javascript
在js中单选框和复选框获取值的方式
2009/11/06 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
Jquery中"$(document).ready(function(){ })"函数的使用详解
2013/12/30 Javascript
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
2014/06/24 Javascript
JS控制伪元素的方法汇总
2016/04/06 Javascript
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
2017/03/04 Javascript
jQuery图片缩放插件smartZoom使用实例详解
2017/08/25 jQuery
JS获取字符对应的ASCII码实例
2017/09/10 Javascript
JS实现静态页面搜索并高亮显示功能完整示例
2017/09/19 Javascript
javascript基本常用排序算法解析
2017/09/27 Javascript
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
Nodejs中怎么实现函数的串行执行
2019/03/02 NodeJs
Vue监听页面刷新和关闭功能
2019/06/20 Javascript
element-ui tree结构实现增删改自定义功能代码
2020/08/31 Javascript
浏览器JavaScript调试功能无法使用解决方案
2020/09/18 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
Python里隐藏的“禅”
2014/06/16 Python
python+selenium实现QQ邮箱自动发送功能
2019/01/23 Python
Python实现的企业粉丝抽奖功能示例
2019/07/26 Python
Python中zip()函数的解释和可视化(实例详解)
2020/02/16 Python
python接口自动化之ConfigParser配置文件的使用详解
2020/08/03 Python
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
会务接待方案
2014/02/27 职场文书
校运会口号
2014/06/18 职场文书
个人四风问题对照检查材料
2014/10/01 职场文书
群众路线专项整治方案
2014/10/27 职场文书
《悲惨世界》:比天空更广阔的是人的心灵
2020/01/16 职场文书
详解MySql中InnoDB存储引擎中的各种锁
2022/02/12 MySQL
【2·13】一图读懂中国无线电发展
2022/02/18 无线电