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 相关文章推荐
JQUERY 浏览器判断实现函数
Aug 20 Javascript
Js sort排序使用方法
Oct 17 Javascript
关于js注册事件的常用方法
Apr 03 Javascript
javascript结合CSS实现苹果开关按钮特效
Apr 07 Javascript
js使用DOM操作实现简单留言板的方法
Apr 10 Javascript
Node.js编写组件的三种实现方式
Feb 25 Javascript
jquery.uploadifive插件怎么解决上传限制图片或文件大小问题
May 08 jQuery
sublime text配置node.js调试(图文教程)
Nov 23 Javascript
微信小程序上传文件到阿里OSS教程
May 20 Javascript
微信小程序全局变量的设置、使用、修改过程解析
Sep 24 Javascript
微信公众号开发之微信支付代码记录的实现
Oct 16 Javascript
微信sdk实现禁止微信分享(使用原生php实现)
Nov 15 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 面向对象 PHP5 中的常量
2010/05/05 PHP
php stream_get_meta_data返回值
2013/09/29 PHP
CodeIgniter框架数据库事务处理的设计缺陷和解决方案
2014/07/25 PHP
php使用google地图应用实例
2014/12/31 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
PHP对象的浅复制与深复制的实例详解
2017/10/26 PHP
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
2010/05/18 Javascript
使用CoffeeScrip优美方式编写javascript代码
2015/10/28 Javascript
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结
2016/03/16 Javascript
基于HTML+CSS+JS实现增加删除修改tab导航特效代码
2016/08/05 Javascript
JS取数字小数点后两位或n位的简单方法
2016/10/24 Javascript
AngularJs表单验证实例代码解析
2016/11/29 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
jQuery实现的回车触发按钮事件功能示例
2018/03/25 jQuery
使用vue-infinite-scroll实现无限滚动效果
2018/06/22 Javascript
Vue.js 十五分钟入门图文教程
2018/09/12 Javascript
vue-cli3使用 DllPlugin 实现预编译提升构建速度
2019/04/24 Javascript
详解关于webpack多入口热加载很慢的原因
2019/04/24 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
Vue左滑组件slider使用详解
2020/08/21 Javascript
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
2017/04/27 Python
Python实现合并两个列表的方法分析
2018/05/28 Python
500行Python代码打造刷脸考勤系统
2019/06/03 Python
Python 中的 import 机制之实现远程导入模块
2019/10/29 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
2020/07/28 Python
python实现定时发送邮件到指定邮箱
2020/12/23 Python
突袭HTML5之Javascript API扩展2—地理信息服务及地理位置API学习
2013/01/31 HTML / CSS
英国最大的化装舞会服装网站:Fancydress.com
2017/08/15 全球购物
工程力学硕士生的自我评价范文
2013/11/16 职场文书
幼儿园植树节活动总结
2014/07/04 职场文书
党的群众路线教育实践活动查摆问题自查报告
2014/10/10 职场文书
起诉书范文
2015/05/20 职场文书
企业培训简报范文
2015/07/20 职场文书
JVM钩子函数的使用场景详解
2021/08/23 Java/Android
Moment的feature导致线上bug解决分析
2022/09/23 Javascript