EfonMark

一番码客 : 挖掘你关心的亮点。
http://www.efonmark.com

本文目录:

[TOC]

image-20200302223326821

crypto模块

NodeJs的crypto模块提供了哈希、加密相关的功能支持。

哈希算法:MD5,SHA1,SHA256,Hmac

  • 哈希算法用来对数据进行签名,确定数据的唯一性,以及是否被篡改。
  • 由于其过程不可逆,也常常用来对用户密码进行加密。
  • Hmac(hash增强),是基于key和hash的认证算法。它在上面哈希算法的基础上,再传入一个key。只要key变化,即使输入同样的数据也会得到不同的结果。可以将Hmac理解为随机数增强的哈希算法。
  • 代码示例:
1
'use strict'
2
3
let crypto = require('crypto')
4
5
let data = "一番码客:实用工具 = python + nodejs";
6
7
// md5 哈希算法
8
let md5 = crypto.createHash("md5");
9
let sha1 = crypto.createHash("sha1");
10
let sha256 = crypto.createHash("sha256");
11
let salt = "nodejs";
12
let hmac = crypto.createHmac("sha1", salt);
13
14
md5.update(data);
15
let result = md5.digest("hex");
16
console.log('md5:' + result);
17
18
sha1.update(data);
19
result = sha1.digest("hex");
20
console.log('sha1:' + result);
21
22
sha256.update(data);
23
result = sha256.digest("hex");
24
console.log('sha256:' + result);
25
26
// 随机数增强的hash算法
27
hmac.update(data);
28
result = hmac.digest("hex");
29
console.log('hmac:'+result);

运行结果:

image-20200302224936696

对称加密算法:AES

  • AES是一种常用的对称加密算法,加解密都用同一个密钥。
  • 示例代码:
1
const crypto = require('crypto');
2
3
// 加密
4
function genSign(src, key, iv) {
5
    let sign = '';
6
    const cipher = crypto.createCipheriv('aes-128-cbc', key, iv);
7
    sign += cipher.update(src, 'utf8', 'hex');
8
    sign += cipher.final('hex');
9
    return sign;
10
}
11
12
// 解密
13
function deSign(sign, key, iv) {
14
    let src = '';
15
    const cipher = crypto.createDecipheriv('aes-128-cbc', key, iv);
16
    src += cipher.update(sign, 'hex', 'utf8');
17
    src += cipher.final('utf8');
18
    return src;
19
}
20
21
// ase-128-cbc 加密算法要求key和iv长度都为16
22
const data = '一番码客:实用工具 = python + nodejs'
23
24
const key = Buffer.from('9vApxLk5G3PAsJrM', 'utf8');
25
const iv = Buffer.from('FnJL7EDzjqWjcaY9', 'utf8');
26
27
const sign = genSign(data, key, iv);
28
console.log(sign);
29
30
31
const src=deSign('3299dbc38361cc6d2d0a3f53774848aab6c660791d5714de4e8f0f685419dda4353c7ac25f9ccdb34d47687376d59fdc', key, iv);
32
console.log(src);

运行结果:

image-20200302232802494

event模块

大多数 Node.js 核心 API 都采用惯用的异步事件驱动架构,其中某些类型的对象(触发器)会周期性地触发命名事件来调用函数对象(监听器)。

例如,fs.ReadStream会在文件被打开时触发事件;stream 会在数据可读时触发事件。

当你想设计一个模块,它具有在某个条件下执行某个操作的功能,那么event模块就派上用场了。

例如:你想设计一个用户注册模块,当用户注册成功之后给用户发送一个email。

  • 示例代码:
1
'use strict'
2
let EventEmitter = require('events');
3
4
class MyEmitter extends EventEmitter{
5
6
}
7
8
let myEmitter = new MyEmitter();
9
// 监听事件
10
myEmitter.on('registerSuccess', (p)=>{
11
    // console.log("我笑了, 参数是:"+ JSON.stringify(p));
12
    console.log("用户注册成功了,我马上要发送邮件");
13
});
14
15
//触发事件
16
setTimeout(()=>{
17
    let person = {
18
        name: "赵四"
19
    };
20
    myEmitter.emit("registerSuccess", person);
21
}, 2000);

结果:

image-20200302233259230

参考

学习视频

一番同步了对应的学习视频到B站,长按识别可访问一番B站主页观看。

image-20200128162909013

一番雾语:NodeJs-crypto和events模块。


免费知识星球:一番码客-积累交流
微信公众号:一番码客
微信:Efon-fighting
网站:http://www.efonmark.com

蜀ICP备19039940号

总访问量为