安全工具 (Security)
@pt/utils/modules/crypto 提供了加密解密相关的工具函数,基于 CryptoJS 实现。
全局配置
可以通过全局配置函数设置默认的加密配置。
setGlobalConfig
设置简单加密的全局配置。
typescript
import { setGlobalConfig } from '@pt/utils/modules/crypto';
// 设置全局配置
setGlobalConfig({
key: 'yourCustomKey',
iv: 'yourCustomIV'
});
// 使用全局配置加密
const encrypted = encryptText('Hello');
// 使用全局配置解密
const decrypted = decryptText(encrypted);setGlobalComplexConfig
设置复杂加密的全局配置。
typescript
import { setGlobalComplexConfig } from '@pt/utils/modules/crypto';
// 设置全局配置
setGlobalComplexConfig({
key: 'yourCustomKey',
iv: 'yourCustomIV',
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
// 临时配置会覆盖全局配置
const encrypted = encryptText('Hello', {
key: 'temporaryKey'
});
const decrypted = decryptText(encrypted, {
key: 'temporaryKey'
});混合使用
typescript
// 设置全局复杂配置
setGlobalComplexConfig({
key: 'globalKey',
iv: 'globalIV'
});
// 使用全局配置
const encrypted1 = encryptComplex({ data: 'test1' });
// 使用临时配置
const encrypted2 = encryptComplex({ data: 'test2' }, {
key: 'tempKey',
iv: 'tempIV'
});简单加密解密
适用于基本的数据加密需求,使用AES算法,配置简单。
encryptText
简单AES加密。
typescript
import { encryptText } from '@pt/utils/modules/crypto';
// 基本使用
const encrypted = encryptText('Hello, 世界');
// 'U2FsdGVkX1+k7hsrmfutPZhLlia0AhUshTZXRNBYjUw='
// 自定义密钥
const encrypted2 = encryptText('Hello, 世界', { key: 'customKey' });decryptText
简单AES解密。
typescript
import { decryptText } from '@pt/utils/modules/crypto';
// 基本使用
const decrypted = decryptText('U2FsdGVkX1+k7hsrmfutPZhLlia0AhUshTZXRNBYjUw=');
// 'Hello, 世界'
// 自定义密钥
const decrypted2 = decryptText(encrypted2, { key: 'customKey' });复杂加密解密
适用于需要更高安全性的场景,支持IV向量、加密模式、填充方式等配置。
encryptComplex
复杂AES加密,支持对象加密,返回大写十六进制字符串。
typescript
import { encryptComplex } from '@pt/utils/modules/crypto';
// 加密字符串
const encrypted = encryptComplex('Hello, 世界');
// 加密对象
const encrypted2 = encryptComplex({
name: 'John',
age: 30
});
// 自定义配置
const encrypted3 = encryptComplex('Hello', {
key: 'customKey',
iv: 'customIV',
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});decryptComplex
复杂AES解密,支持泛型类型。
typescript
import { decryptComplex } from '@pt/utils/modules/crypto';
// 解密字符串
const decrypted = decryptComplex<string>(encrypted);
// 解密对象
interface User {
name: string;
age: number;
}
const decrypted2 = decryptComplex<User>(encrypted2);
console.log(decrypted2.name); // 'John'
// 自定义配置
const decrypted3 = decryptComplex(encrypted3, {
key: 'customKey',
iv: 'customIV',
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});配置选项
typescript
interface AESConfig {
key: string; // 密钥
iv?: string; // 初始化向量
mode?: typeof CryptoJS.mode.CBC; // 加密模式
padding?: typeof CryptoJS.pad.Pkcs7; // 填充方式
}性能考虑
Base64 vs AES:
- Base64: 仅做编码,速度极快,适合轻量场景
- AES: 提供加密保护,计算复杂度更高
影响AES性能的因素:
- 数据块大小
- 加密模式(CBC比ECB耗时)
- 设备对Web Crypto API的优化程度
使用建议
选择合适的加密级别:
- 一般数据:使用
encryptText/decryptText - 敏感数据:使用
encryptComplex/decryptComplex
- 一般数据:使用
错误处理:
typescript
try {
const decrypted = decryptComplex(encrypted);
} catch (error) {
console.error('解密失败:', error);
}- 类型安全:
typescript
interface UserData {
id: number;
name: string;
}
const encrypted = encryptComplex<UserData>({
id: 1,
name: 'John'
});
const decrypted = decryptComplex<UserData>(encrypted);
// decrypted 具有完整的类型提示常见问题
Q: 为什么不直接打包 crypto-js?
A: crypto-js 是 CommonJS 模块,直接打包可能导致:
- 模块初始化问题(
Cannot set properties of undefined) - 增加包体积
- 版本冲突
Q: 我不想安装额外的依赖怎么办?
A: 如果不需要加密功能,可以不使用 security 模块,也就不需要安装 crypto-js。或者可以使用浏览器原生的 Web Crypto API。
Q: 如何检查是否需要安装 crypto-js?
A: 在你的代码中搜索以下导入:
typescript
import { encryptText, decryptText, encryptComplex, decryptComplex } from '@pt/utils';
// 或
import * as security from '@pt/utils/modules/crypto';如果有使用这些功能,就需要安装 crypto-js。
注意事项
- 密钥管理至关重要,避免硬编码在代码中
- 考虑使用环境变量或配置文件存储密钥
- 大数据量加密可能影响性能
- 确保加密和解密使用相同的配置