UNPKG

@mamba-le/auth

Version:
105 lines (104 loc) 3.29 kB
/** * @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 ''; } } }