一、util模块
node.js提供了很多模块,其中util就是nodejs核心模块之一,主要就是为了弥补js过于精简而造成的不足。
1. util.inspect
util.inspect(object,[showHidden],[depth],[colors])是一个将任意对象转换为字符串的方法,通常用于调试和错误输出。
该方法最少接受一个参数object,showHidden可选,当值为true时,会打印出更多隐藏 的信息。depth是最大递归层数。
可以指定层数,控制输出的信息,color为true 的时候,将以ANSI 颜色编码输出。
var util = require('util');
function Person() {
this.name = 'WJ';
this.toString = function() {
return this.name;
};
}
var obj = new Person();
console.log(util.inspect(obj)); /* Person { name: 'WJ', toString: [Function] } */
console.log(util.inspect(obj, true));//showHidden=true 输出更多信息
/*
Person {
name: 'WJ',
toString:
{ [Function]
[length]: 0,
[name]: '',
[arguments]: null,
[caller]: null,
[prototype]: { [constructor]: [Circular] } } }
*/
2.util.format
util.format(format[, …])格式化字符串,根据第一个参数,返回一个格式化字符串,类似printf的格式化输出。 传入的第一个参数是一个字符串,其中包含零个或多个占位符,format方法会将其中的每一个占位符被替换为与其对应的值后,输出结果。 format方法支持的占位符有:
%s - 字符串.
%d - 数字 (整型和浮点型).
%j - JSON. 如果这个参数包含循环对象的引用,将会被替换成字符串 ‘[Circular]’。
%% - 单独一个百分号(‘%’)。不会占用一个参数。
代码实例
console.log(util.format('%s:%s', 'a',"b")); // a:b
console.log(util.format('%s:%s:%j', 'a', 'b', 'c')); // a:b:"c"
console.log(util.format(1, 2, 3)); // 1 2 3
3.util.inherits
util.inherits(constructor, superConstructor)是用来实现对象间原型继承的函数
let util = require("util");
function WJ() {
this.name = "WJ";
this.one = "number";
this.sayWho = function () {
console.log("我是"+this.name);
}
}
WJ.prototype.sayHello = function () {
console.log(this.name);
};
function JJ() {
this.name = "JJ";
}
util.inherits(JJ,WJ);
var WJobj = new WJ();
WJobj.sayHello();//WJ
WJobj.sayWho();//我是WJ
console.log(WJobj);//WJ { name: 'WJ', one: 'number', sayWho: [Function] }
var JJobj = new JJ();
JJobj.sayHello();//JJ
JJobj.one();//JJobj.one is not a function,这个JJobj函数只继承了WJ函数的原型中定义的函数,其他的都没有继承
二、crypto模块
不可反编译加密代码:
const crypto = require('crypto');
function l(param) {
console.log(param);
}
const md5 = crypto.createHash('md5');//创建一个md5 hash算法
md5.update('aa');//添加要转化的值
md5.update('cc');//与前面的要转化的值进行拼接
l(md5.digest('hex'));//打印16进制的密文,
const sha1 = crypto.createHash('sha1');//创建一个sh1 hash算法
sha1.update('bbbb');
l(sha1.digest('hex'));
const hmac = crypto.createHmac('md5', 'key');//创建一个带秘钥的sha1或者md5算法
hmac.update('aacc');
l(hmac.digest('hex'));
可反编译的加密代码:
const crypto = require('crypto');
function l(param) {
console.log(param);
}
function aesEncode(data, key) {
const cipher = crypto.createCipher('aes192', key);
var crypted = cipher.update(data, 'utf8', 'hex');
crypted += cipher.final('hex');
return crypted;
}
//创建解密算法
function aesDecode(encrypted, key) {
const decipher = crypto.createDecipher('aes192', key);
var decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
var data = 'I Love You';
var key = '123545';
l(aesEncode(data, key));
l(data);
l(aesDecode(aesEncode(data, key), key));
//输出======================
/*
313d38ed64db44cb2c43b8c33feda5a1
I Love You
I Love You
*/
MD5加密算法
MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由Mit Laboratory for Computer Science和Rsa data security inc的Ronald l. rivest开发出来,经md2、md3和md4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密匙前被“压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数).不管是md2、md4还是md5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要.
MD5 算法的哈希值大小为 128 位。是一种不可逆的算法。
算法特点
- 两个不同的明文不会得到相同的输出值
- MD5结果不能反推明文,不可逆
安全性
从安全的角度讲,MD5的输出为128位,若采用纯强力攻击寻找一个消息具有给定Hash值的计算困难性为2128,用每秒可试验1000000000个消息的计算机需时1.07×1022年。若采用生日攻击法,寻找有相同Hash值的两个消息需要试验264个消息,用每秒可试验1000000000个消息的计算机需时585年。
实际应用上,例如我知道‘password’的MD5值是5f4dcc3b5aa765d61d8327deb882cf99,那么我就用一个数据库存起来,只要我看到5f4dcc3b5aa765d61d8327deb882cf99,我就知道这个是口令‘password‘使用MD5处理之后的值,原来的口令就是’password'。MD5在身份鉴别系统中用于口令保护已经是很久了事情了,大部分黑客也有针对这种Hash方式准备相应的数据库进行反查,这种数据库称为彩虹表,MD5的安全性大大减弱。
代码:
var crypto = require('crypto');
var content = 'password'
var md5 = crypto.createHash('md5');
md5.update(content);
var d = md5.digest('hex');
console.log(d)//输出5f4dcc3b5aa765d61d8327deb882cf99
SHA1算法
算法简介
SHA1的全称是Secure Hash Algorithm(安全哈希算法)。加密哈希函数将任意长度的二进制字符串映射为固定长度的小型二进制字符串。加密哈希函数有这样一个属性:在计算上不大可能找到散列为相同的值的两个不同的输入;也就是说,两组数据的哈希值仅在对应的数据也匹配时才会匹配。数据的少量更改会在哈希值中产生不可预知的大量更改。所以你很难从加密后的文字中找到蛛丝马迹。
SHA1 算法的哈希值大小为 160 位。是一种不可逆的算法。
代码:
var crypto = require('crypto');
var content = 'password'
var shasum = crypto.createHash('sha1');
shasum.update(content);
var d = shasum.digest('hex');
console.log(d)//输出5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
MD5与sha1的不同
- MD5 使用小端排序LITTLE-ENDIAN,sha1 使用大端排序BIG-ENDIAN
- MD5最后生成的摘要信息是16个字节,SHA1是20个字节。