NodeJS 内置模块之crypto

文章背景node 7.2.0版本。主要参照内容Nodejs官方文档。语法ES6。

crypto作为nodeJS已经稳定下来的模块在整个node中具有举足轻重的地位,一切app都需要加密解密,那么crypto就是一个提供加密功能的模块。在这个模块中已经打包了OpenSSL hash, HMAC(哈希信息验证码),cipher(加密),decipher(解密),sign(签名)以及verify(验证)的功能。

我们先看nodeJS官方文档中的一段代码,我们逐句进行分析。

const crypto = require('crypto');
//首先引入crypto模块进项目中;
const secret = 'abcdefg';
//随手写一段明文字符串,保存到常量secret中。
const hash = crypto.createHmac('sha256', secret)//我们首先调用crypto模块中的createHmac()方法,通过sha256算法对明文进行哈希化。
                   .update('I love cupcakes')
//在这段哈希值的基础之上,我们添加明文I love cupcakes。
                   .digest('hex');
//在更新之后,我们将更新的内容的进行十六进制的消化吸收。
console.log(hash);
// Prints:
//   c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e

如果你的node项目中不包含crypto模块,你希望对此进行检查下面这段try catch代码就可以做到,尽管本人认为这种情况微乎其微;

var crypto;
try {
  crypto = require('crypto');
} catch (err) {
  console.log('crypto support is disabled!');
}

证书

所谓SPKAC就是网景内核原生中的一个证明签字请求机制。如今已经正式成为HTML5的注册机元素(HTML5’s keygen element.)中的一部分。

crypto模块使用SPKAC数据提供证书类。大多数场景下用于处理由HTML5 元素生成的输入,NodeJS在其内部安装使用OpenSSL`s SPKAC。

新建证书

我们通过使用new关键字或者调用crypto.Certificate()方法实例化一个证书类型。

const crypto = require('crypto');

const cert1 = new crypto.Certificate();
const cert2 = crypto.Certificate();

certificate.exportChallenge(spkac);

spkac 数据结构包含了一个公钥和一个质询。certificate.exportChallenge()方法在nodeJS的Buffer表单中返回质询元素。spkac的参数要么是一个字符串要么就是一个Buffer.

const cert = require('crypto').Certificate();
const spkac = getSpkacSomehow();
const challenge = cert.exportChallenge(spkac);
console.log(challenge.toString('utf8'));

certificate.exportPublicKey(spkac)

正如上节所述,spkac数据结构是包含一个公钥的,那么返回公钥的方法就是
certificate.exportPublicKey(spkac);

const cert = require('crypto').Certificate();
const spkac = getSpkacSomehow();
const publicKey = cert.exportPublicKey(spkac);
console.log(publicKey);
// Prints: the public key as ...>

certificate.verifySpkac(spkac)

如果返回的被赋予的spkac数据结构是有效的,那么返回值则为true,反之false.

const cert = require('crypto').Certificate();
const spkac = getSpkacSomehow();
console.log(cert.verifySpkac(Buffer.from(spkac)));
// Prints: true or false

Cipher加密

cipher类实例化后会被译成数据,该类往往用于以下两种情况:
1.作为一个流式文件它可读可写。一个简单的未编译的数据会被写入到可读端,并生成
编译数据。
2.使用cipher.update()和cipher.final()两种方法直接生成编译数据。

crypto.createCiper()或者cryto.createCipheriv()方法用于创建Cipher实例化对象。一定要注意,使用new关键字是没办法直接创建一个Cipher对象的。

我们来看下面这段代码:

const crypto = require('crypto');
const cipher = crypto.createCipher('aes192', 'a password');
//使用aes192对称加密算法,将‘a password’这段明文进行加密
var encrypted = '';
cipher.on('readable', () => {
  var data = cipher.read();
  if (data)
    encrypted += data.toString('hex');
});
cipher.on('end', () => {
  console.log(encrypted);
  // Prints: ca981be48e90867604588e75d04feabb63cc007a8f8ad89b10616ed84d815504
});

cipher.write('some clear text data');
cipher.end();

你可能感兴趣的:(node)