Diffie-Hellman
是一种建立密钥的方法,需要安全通信的双方可以用这个方法确定对称密钥,它所产生的密钥可用于加密、进一步的密钥管理或任何其它的加密方式。Node.js的crypto
模块,封装了Diffie-Hellman
类,可以用这个类来生成交换秘钥。
1. Diffie-Hellman
类的创建
创建Diffie-Hellman
类可以使用crypto模块的crypto.createDiffieHellman()
方法,也可以使用crypto.getDiffieHellman()
预定义一下Diffie-Hellman
类:
-
crypto.createDiffieHellman(prime_length[, generator])
:创建一个Diffie-Hellman
密钥交换,并根据给定的位长度prime_length
生成一个质数。如果没有指定参数generator
,默认为2
-
crypto.createDiffieHellman(prime[, prime_encoding][, generator][, generator_encoding])
:使用传入的prime
和generator
创建Diffie-Hellman
秘钥交互对象。
generator
可以是数字、字符串或Buffer,如果没有指定,默认为2
prime_encoding
和generator_encoding
可以是:'binary'
、'hex'
,或'base64'
。如果没有指定prime_encoding
,则 Buffer 为prime
。如果没有指定generator_encoding
,则 Buffer 为generator
。 -
crypto.getDiffieHellman(group_name)
:创建一个预定义Diffie-Hellman
秘钥交换对象。group_name
为组名,支持的组:'modp1'
、'modp2'
、'modp5'
(定义于RFC 2412)或'modp14'
、'modp15'
、'modp16'
、'modp17'
、'modp18'
(定义于RFC 3526)。 与上述crypto.createDiffieHellman()创建对象类似,但是不允许修改秘钥交换(例如, diffieHellman.setPublicKey()
)。使用这套流程的好处是,双方不需要生成或交换组组余数,节省了计算和通讯时间。
2. Diffie-Hellmancipher
类简介
Diffie-Hellman
类中包含生成公/私钥,及生在共享密钥的相关方法:
-
diffieHellman.generateKeys([encoding])
:生成秘钥和公钥,并返回指定格式的公钥。生成的公钥可以转交给第三方使用。编码方式:'binary'
,'hex'
, 或'base64'
。如果没有指定编码方式,将返回 Buffer。 -
diffieHellman.computeSecret(other_public_key[, input_encoding][, output_encoding])
:以other_public_key
作为第三方公钥来计算共享秘钥,并返回这个共享秘密。
参数input_encoding
为密钥编码方式,output_encoding
为计算出的共享密钥的编码方法。编码方式可以是:'binary'
、'hex'
或'base64'
。如果没有指定编码方式,则默认为一个Buffer。 -
diffieHellman.getPrime([encoding])
:根据指定的编码格式返Diffie-Hellman
质数,编码方式可以是:'binary'
、'hex'
或'base64'
。如果没有指定编码方式,则返回一个Buffer。 -
diffieHellman.getGenerator([encoding])
:根据指定的编码格式返Diffie-Hellman
生成器,编码方式可以是:'binary'
、'hex'
或'base64'
。如果没有指定编码方式,则返回一个Buffer。 -
diffieHellman.getPublicKey([encoding])
:根据指定的编码格式返Diffie-Hellman
公钥,编码方式可以是:'binary'
、'hex'
或'base64'
。如果没有指定编码方式,则返回一个Buffer。 -
diffieHellman.getPrivateKey([encoding])
:根据指定的编码格式返Diffie-Hellman
私钥,编码方式可以是:'binary'
、'hex'
或'base64'
。如果没有指定编码方式,则返回一个Buffer。 -
diffieHellman.setPublicKey([encoding])
:设置Diffie-Hellman
公钥,编码方式可以是:'binary'
、'hex'
或'base64'
。如果没有指定编码方式,默认为Buffer。 -
diffieHellman.getPrivateKey([encoding])
:设置Diffie-Hellman
私钥,编码方式可以是:'binary'
、'hex'
或'base64'
。如果没有指定编码方式,默认为Buffer。
3. Diffie-Hellman
类使用示例
创建Diffie-Hellman
类,按相同规则生成公钥和私钥,计算共享密钥:
var crypto = require('crypto'); var alice = crypto.getDiffieHellman('modp5'); var bob = crypto.getDiffieHellman('modp5'); //也可以使用如下方式生成创建对象 // var alice = crypto.createDiffieHellman(7); // var bob = crypto.createDiffieHellman(7); //生成公钥和私钥 alice.generateKeys(); bob.generateKeys(); //计算共享密钥相同 var alice_secret = alice.computeSecret(bob.getPublicKey(), null, 'hex'); var bob_secret = bob.computeSecret(alice.getPublicKey(), null, 'hex'); //两个共享密钥相同 console.log(alice_secret == bob_secret); //true