2017-02-17 16:34:20 +08:00
|
|
|
|
/**
|
|
|
|
|
* 加密类 md5/sha1/base64
|
|
|
|
|
* @authors yutent (yutent@doui.cc)
|
|
|
|
|
* @date 2015-09-10 13:56:18
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
|
|
let crypto = require('crypto')
|
|
|
|
|
let fs = require('fs')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class C {
|
|
|
|
|
|
|
|
|
|
constructor(){
|
|
|
|
|
this.crypto = crypto
|
|
|
|
|
|
|
|
|
|
this.hash = (mode, data, outEncode) => {
|
|
|
|
|
let sum = crypto.createHash(mode)
|
|
|
|
|
let isBuffer = Buffer.isBuffer(data)
|
|
|
|
|
|
|
|
|
|
sum.update(data, isBuffer ? 'binary' : 'utf8')
|
|
|
|
|
return sum.digest(outEncode || 'hex')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.hmac = (mode, data, key, outEncode) => {
|
|
|
|
|
key = key || ''
|
|
|
|
|
let sum = crypto.createHmac(mode, key)
|
|
|
|
|
let isBuffer = Buffer.isBuffer(data)
|
|
|
|
|
|
|
|
|
|
sum.update(data, isBuffer ? 'binary' : 'utf8')
|
|
|
|
|
return sum.digest(outEncode || 'hex')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.cipher = (mode, data, key, inEncode, outEncode) => {
|
|
|
|
|
key = key || ''
|
|
|
|
|
let isBuffer = Buffer.isBuffer(data)
|
|
|
|
|
inEncode = isBuffer ? 'binary' : (inEncode || 'utf8')
|
|
|
|
|
outEncode = outEncode || 'base64'
|
|
|
|
|
|
|
|
|
|
let cp = crypto.createCipher(mode, key)
|
|
|
|
|
let res = cp.update(data, inEncode, outEncode)
|
|
|
|
|
return res + cp.final(outEncode)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.decipher = (mode, data, key, inEncode, outEncode) => {
|
|
|
|
|
key = key || ''
|
|
|
|
|
let isBuffer = Buffer.isBuffer(data)
|
|
|
|
|
inEncode = isBuffer ? 'binary' : (inEncode || 'base64')
|
|
|
|
|
outEncode = outEncode || 'utf8'
|
|
|
|
|
|
|
|
|
|
let dcp = crypto.createDecipher(mode, key)
|
|
|
|
|
let res = dcp.update(data, inEncode, outEncode)
|
|
|
|
|
return res + dcp.final(outEncode)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.cipheriv = (mode, data, key, iv, inEncode, outEncode) => {
|
|
|
|
|
key = key || '0000000000000000'
|
|
|
|
|
iv = iv || ''
|
|
|
|
|
let isBuffer = Buffer.isBuffer(data)
|
|
|
|
|
inEncode = isBuffer ? 'binary' : (inEncode || 'utf8')
|
|
|
|
|
outEncode = outEncode || 'base64'
|
|
|
|
|
|
|
|
|
|
let cp = crypto.createCipheriv(mode, key, iv)
|
|
|
|
|
let res = cp.update(data, inEncode, outEncode)
|
|
|
|
|
return res + cp.final(outEncode)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.decipheriv = (mode, data, key, iv, inEncode, outEncode) => {
|
|
|
|
|
key = key || '0000000000000000'
|
|
|
|
|
iv = iv || ''
|
|
|
|
|
let isBuffer = Buffer.isBuffer(data)
|
|
|
|
|
inEncode = isBuffer ? 'binary' : (inEncode || 'base64')
|
|
|
|
|
outEncode = outEncode || 'utf8'
|
|
|
|
|
|
|
|
|
|
let dcp = crypto.createDecipheriv(mode, key, iv)
|
|
|
|
|
let res = dcp.update(data, inEncode, outEncode)
|
|
|
|
|
return res + dcp.final(outEncode)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* [rand 生成指定长度的随机字符串]
|
|
|
|
|
* @param {[type]} len [要得到的字符串长度]
|
|
|
|
|
* @param {[type]} forceNum [是否强制返回纯数字]
|
|
|
|
|
*/
|
|
|
|
|
rand(len, forceNum){
|
|
|
|
|
let str = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789'
|
|
|
|
|
if(forceNum)
|
|
|
|
|
str = '0123456789'
|
|
|
|
|
let max = str.length
|
|
|
|
|
let tmp = ''
|
|
|
|
|
for(let i = 0; i < len; i++){
|
|
|
|
|
let r = Math.floor(Math.random() * max)
|
|
|
|
|
tmp += str[r]
|
|
|
|
|
}
|
|
|
|
|
return tmp
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* [md5 md5加密]
|
|
|
|
|
* @param {Str/Num} str [要加密的字符串]
|
|
|
|
|
* @param {Str} encode [hex/base64]
|
|
|
|
|
*/
|
|
|
|
|
md5(str, encode){
|
|
|
|
|
if(typeof str !== 'string' && typeof str !== 'number')
|
|
|
|
|
return str
|
|
|
|
|
|
|
|
|
|
return this.hash('md5', str + '', encode)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* [md5Sign 获取文件的md5签名]
|
|
|
|
|
* @param {Str} file [文件路径]
|
|
|
|
|
*/
|
|
|
|
|
md5Sign(file){
|
|
|
|
|
if(!fs.existsSync(file))
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
let fileStream = fs.readFileSync(file)
|
|
|
|
|
return this.hash('md5', fileStream)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* [sha1 sha1加密]
|
|
|
|
|
* @param {Str/Num} str [要加密的字符串]
|
|
|
|
|
* @param {Str} encode [hex/base64]
|
|
|
|
|
*/
|
|
|
|
|
sha1(str, encode){
|
|
|
|
|
if(typeof str !== 'string' && typeof str !== 'number')
|
|
|
|
|
return str
|
|
|
|
|
|
|
|
|
|
return this.hash('sha1', str + '', encode)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* [sha1Sign 获取文件的sha1签名]
|
|
|
|
|
* @param {Str} file [文件路径]
|
|
|
|
|
*/
|
|
|
|
|
sha1Sign(file){
|
|
|
|
|
if(!fs.existsSync(file))
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
let fileStream = fs.readFileSync(file)
|
|
|
|
|
return this.hash('sha1', fileStream)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* [sha256 sha256加密]
|
|
|
|
|
* @param {Str/Num} str [要加密的字符串]
|
|
|
|
|
* @param {Str} encoding [hex/base64]
|
|
|
|
|
*/
|
|
|
|
|
sha256(str, encoding){
|
|
|
|
|
if(typeof str !== 'string' && typeof str !== 'number')
|
|
|
|
|
return str
|
|
|
|
|
|
|
|
|
|
return this.hash('sha256', str + '', encoding)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* [base64encode base64加密]
|
|
|
|
|
* @param {Str/Num/Buffer} str [要加密的字符串]
|
|
|
|
|
* @param {bool} urlFriendly [是否对URL友好,默认否,是则会把+转成-,/转成_]
|
|
|
|
|
*/
|
|
|
|
|
base64encode(str, urlFriendly){
|
|
|
|
|
if(!Buffer.isBuffer(str))
|
2017-03-12 02:00:32 +08:00
|
|
|
|
str = Buffer.from(str + '')
|
2017-02-17 16:34:20 +08:00
|
|
|
|
let encode = str.toString('base64')
|
|
|
|
|
if(urlFriendly)
|
|
|
|
|
encode = encode.replace(/[+\/]/g, m => {return m === '+' ? '-' : '_'}).replace(/=/g, '')
|
|
|
|
|
|
|
|
|
|
return encode
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* [base64decode base64解密]
|
|
|
|
|
* @param {Str} str [要解密的字符串]
|
|
|
|
|
* @param {bool} urlFriendly [之前是否对结果采用了URL友好处理]
|
|
|
|
|
* @param {Str/Buffer} encoding [编码,默认utf-8]
|
|
|
|
|
*/
|
|
|
|
|
base64decode(str, urlFriendly, encoding){
|
|
|
|
|
if(urlFriendly)
|
|
|
|
|
str = str.replace(/[-_]/g, m => {return m === '-' ? '+' : '/'}).replace(/[^A-Za-z0-9\+\/]/g, '')
|
|
|
|
|
|
|
|
|
|
let buff = Buffer.from(str, 'base64')
|
|
|
|
|
|
|
|
|
|
if (encoding === 'buffer')
|
|
|
|
|
return buff
|
|
|
|
|
|
|
|
|
|
return buff.toString(encoding || 'ascii')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = new C
|