Node.js的加密模块crypto之使用DiffieHellman类生成交换密钥

 2015年07月23日    1104     声明


Diffie-Hellman是一种建立密钥的方法,需要安全通信的双方可以用这个方法确定对称密钥,它所产生的密钥可用于加密、进一步的密钥管理或任何其它的加密方式。Node.js的crypto模块,封装了Diffie-Hellman类,可以用这个类来生成交换秘钥。

  1. Diffie-Hellman类的创建
  2. Diffie-Hellman类简介
  3. 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]):使用传入的 primegenerator创建Diffie-Hellman秘钥交互对象。
    generator可以是数字、字符串或Buffer,如果没有指定,默认为2
    prime_encodinggenerator_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