crypto.js/lib/main.js

206 lines
5.7 KiB
JavaScript
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* 加密类 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))
str = Buffer.from(str + '')
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
base on crypto module
JavaScript 100%