You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
flow-playform-react/src/utils/crypto.ts

70 lines
1.9 KiB
TypeScript

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.

import CryptoJS from 'crypto-js';
// 加密密钥 - 建议从环境变量读取,这里使用固定密钥作为示例
const SECRET_KEY = 'flow-platform-2025-secret-key';
/**
* AES 加密
* @param data 需要加密的数据(对象会被序列化为 JSON
* @returns 加密后的字符串
*/
export function encrypt(data: any): string {
try {
const jsonString = typeof data === 'string' ? data : JSON.stringify(data);
const encrypted = CryptoJS.AES.encrypt(jsonString, SECRET_KEY).toString();
return encrypted;
} catch (error) {
console.error('加密失败:', error);
throw error;
}
}
/**
* AES 解密
* @param encryptedData 加密的字符串
* @returns 解密后的数据(如果是 JSON 对象会自动解析)
*/
export function decrypt(encryptedData: string): any {
try {
const bytes = CryptoJS.AES.decrypt(encryptedData, SECRET_KEY);
const decryptedString = bytes.toString(CryptoJS.enc.Utf8);
if (!decryptedString) {
throw new Error('解密失败:无法解析数据');
}
// 尝试解析为 JSON如果失败则返回原始字符串
try {
return JSON.parse(decryptedString);
} catch {
return decryptedString;
}
} catch (error) {
console.error('解密失败:', error);
throw error;
}
}
/**
* 加密登录参数(用户名和密码)
* @param params 包含 username 和 password 的对象
* @returns 加密后的字符串
*/
export function encryptLoginParams(params: { username: string; password: string }): string {
return encrypt(params);
}
/**
* 解密登录参数
* @param encryptedParams 加密的登录参数字符串
* @returns 解密后的对象,包含 username 和 password
*/
export function decryptLoginParams(encryptedParams: string): { username: string; password: string } | null {
try {
return decrypt(encryptedParams);
} catch (error) {
console.error('解密登录参数失败:', error);
return null;
}
}