Nodejs进阶:使用DiffieHellman密钥交换算法
简介
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
Nodejs进阶:使用DiffieHellman密钥交换算法相关推荐
- 8月30日云栖精选夜读:Nodejs进阶:使用DiffieHellman密钥交换算法
原文地址 Diffie-Hellman(简称DH)是密钥交换算法之一,它的作用是保证通信双方在非安全的信道中安全地交换密钥.目前DH最重要的应用场景之一,就是在HTTPS的握手阶段,客户端.服务端利用 ...
- Diffie-Hellman 密钥交换算法
在文章 安全之初--加解密.签名和证书理解 中说了,密钥交换是对称加密的一大问题,并给出了利用非对称加密传输密钥的解决方案.其实,我们还有另一种解决方案,那就是本文的Diffie-Hellman 密钥 ...
- python实现Diffie-Hellman密钥交换算法
Program : Diffie–Hellman key exchange (on group) In this part, you are required to implement the Dif ...
- 密码学--Diffie-Hellman密钥交换
1.W.Diffie与M.Hellman在1976年提出一个称为Diffie-Hellman密钥交换的公钥密码算法.该算法能用来在两个用户之间安全地交换密钥材料,从而使双方得到一个共享的会话密钥,但该 ...
- https详解+密钥交换算法+公钥与私钥
1.https的简单介绍 https(超文本传输安全协议),它是一个安全通信通道,简单讲就是http的安全版.它使用安全套接字层(SSL)进行信息交换,在http下加入SSL层,https的安全基础是 ...
- java dh算法_dh密钥交换算法java
dh密钥交换算法java 迪菲-赫尔曼密钥交换(Diffie–Hellman key exchange,简称"D–H") 是一种安全协议. 它可以让双方在完全没有对方任何预先信息的 ...
- 密钥交换算法 - Java加密与安全
密钥交换算法我们在使用对称加密算法的时候,我们用的是同一个密钥key 我们以AES加密为例,当我们需要加密明文,我们需要一个随机生成的key,作为密钥进行加解密,最后我们的问题是如何传递密钥 因为不给 ...
- 密码学 专题 DH密钥交换算法
注意事项: SSL中密钥交换算法有6种:无效(没有密钥交换).RSA.匿名Diffie-Hellman.暂时Diffie-Hellman.固定Diffie-Hellman.Fortezza 生成对话密 ...
- 信息安全密码学实验四:Diffie-Hellman密钥交换协议的设计与实现
一.实验目的 理解Diffie-Hellman算法的实现原理,编程实现Diffie-Hellman算法的程序,能够实现密钥协商的目的 二.实验原理 w.Diffie与M.Hellman在1976年提出 ...
最新文章
- C语言,后门程序,C语言CGI编程二 - 编写cmd后门
- lnmp mysql 自动关闭_mysql总是自动停止 日志提示Plugin ‘FEDERATED’ is disabled的解决办法...
- 人脸识别(5)---人脸识别技术及应用概览
- LVS三种工作模式、十种调度算法介绍
- CCF CSP 201703-1 分蛋糕
- 登陆模板_曝北京国安克星将登陆中超,3年进84球,可成中超新政引援模板
- sql 查询 当不想查出记录时候采用的方法
- Pascal VOC 2007和2012数据集下载地址(不需国外,速度依旧让你感动)
- 如何评估开发费 (From 程序匠人)
- 如何从零学习游戏开发
- 手把手教你摆地摊之摆摊卖什么
- XMind8 pro 免费破解版!速度
- 全国公立医院病案首页上报系统(适用于二、三级医院)
- “十四五”数字泉城建设应用场景
- knex 找不到mysql_node knex mysql ER_NOT_SUPPORTED_AUTH_MODE
- 【Tryhackme】Hacker of the Hill #1
- 全球定位系统GPS简介
- 大数据应用安全研究报告
- 四、ESP32单片机wifi的AP与STA模式使用
- Column ‘createTime’ cannot be null,could not execute statement; SQL [n/a]; constraint [null]; nested