文章背景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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
如果你的node项目中不包含crypto模块,你希望对此进行检查下面这段try catch代码就可以做到,尽管本人认为这种情况微乎其微;
var crypto;
try {
crypto = require('crypto');
} catch (err) {
console.log('crypto support is disabled!');
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
证书
所谓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();
- 1
- 2
- 3
- 4
- 5
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'));
- 1
- 2
- 3
- 4
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 <Buffer ...>
- 1
- 2
- 3
- 4
- 5
- 6
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
- 1
- 2
- 3
- 4
- 5
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();
转载:http://blog.csdn.net/qq_33315185/article/details/53436364