@mamba-le/auth
Version:
105 lines (104 loc) • 3.29 kB
text/typescript
/**
* @author 冷 (https://github.com/LengYXin)
* @email lengyingxin8966@gmail.com
* @create date 2021-08-23 11:23:50
* @modify date 2021-08-23 11:23:50
* @desc [算法]
*/
import type Bowser from 'bowser';
import CryptoAes from 'crypto-js/aes';
import CryptoBase64 from 'crypto-js/enc-base64';
import CryptoHex from 'crypto-js/enc-hex';
import CryptoUtf8 from 'crypto-js/enc-utf8';
import CryptoCfb from 'crypto-js/mode-cfb';
import CryptoPkcs7 from 'crypto-js/pad-pkcs7';
import dayjs from 'dayjs';
import lodash from 'lodash';
const day = dayjs().format('YYYY-MM-DD');
export class AuthEncryption {
/** @type AES_Key 秘钥 当前日期 */
static readonly AES_Config = {
AES_Key: CryptoUtf8.parse('day'),
AES_IV: CryptoHex.parse('day'),
set(
SystemInfo: {
/** 微信 版本 */
version?: string;
/** 系统信息 */
system?: string;
/** 小程序APPID */
appId?: string;
/** 浏览器 userAgent */
userAgent?: string;
} & Partial<Bowser.Parser.ParsedResult>,
) {
let keys = [];
// 小程序的 webview 中
if (lodash.some(['MiniProgramEnv', 'miniProgram'], agent => lodash.includes(lodash.toLower(SystemInfo.userAgent), lodash.toLower(agent)))) {
// const system = lodash.join(
// [SystemInfo.os.name, SystemInfo.os.version],
// ' ',
// );
// const version = lodash.join(
// lodash.take(lodash.split(SystemInfo.browser.version, '.'), 3),
// '.',
// );
keys = [day]//lodash.concat(keys, [version]);
} else if (SystemInfo.system) {
// 小程序中
keys = [day]//lodash.concat(keys, [SystemInfo.version]);
}
const keyStr = lodash.join(keys, ' ');
AuthEncryption.AES_Config.AES_Key = CryptoUtf8.parse(keyStr);
AuthEncryption.AES_Config.AES_IV = CryptoHex.parse(keyStr);
lodash.delay(
() => console.log('Encryption', SystemInfo, keyStr),
1000,
);
},
};
/**
* 加密
* @static
* @param {string} message
* @return {*}
* @memberof Encryption
*/
static AES_Encrypt(message: string) {
try {
let srcs = CryptoUtf8.parse(message);
let encrypted = CryptoAes.encrypt(srcs, AuthEncryption.AES_Config.AES_Key, {
iv: AuthEncryption.AES_Config.AES_IV,
mode: CryptoCfb,
padding: CryptoPkcs7,
});
return encrypted.ciphertext.toString().toUpperCase();
} catch (error) {
console.error('LENG ~ Encryption ~ AES_Encrypt ~ error', error);
return '';
}
}
/**
* 解密
* @static
* @param {string} message
* @return {*}
* @memberof Encryption
*/
static AES_Decrypt(message: string) {
try {
let encryptedHexStr = CryptoHex.parse(message);
let srcs = CryptoBase64.stringify(encryptedHexStr);
let decrypt = CryptoAes.decrypt(srcs, AuthEncryption.AES_Config.AES_Key, {
iv: AuthEncryption.AES_Config.AES_IV,
mode: CryptoCfb,
padding: CryptoPkcs7,
});
let decryptedStr = decrypt.toString(CryptoUtf8);
return decryptedStr.toString();
} catch (error) {
console.error('LENG ~ Encryption ~ AES_Decrypt ~ error', error);
return '';
}
}
}