安全规范
概述
本文档提供了 HCompass 应用的安全规范和最佳实践。
数据安全
1. 禁止硬编码密钥
typescript
// 禁止
const API_KEY = "sk-proj-xxxxx";
const PASSWORD = "123456";
// 推荐:使用环境变量
const API_KEY = process.env.API_KEY;2. 敏感数据加密
对敏感数据进行加密存储:
typescript
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
// 加密数据
async function encryptData(data: string): Promise<string> {
// 使用加密算法加密数据
const encrypted = await cryptoFramework.encrypt(data);
return encrypted;
}
// 解密数据
async function decryptData(encrypted: string): Promise<string> {
const decrypted = await cryptoFramework.decrypt(encrypted);
return decrypted;
}3. 安全存储
使用安全的存储方式:
typescript
// 不推荐:明文存储密码
await PreferencesUtil.put("password", password);
// 推荐:加密存储
const encryptedPassword = await encryptData(password);
await PreferencesUtil.put("password", encryptedPassword);网络安全
1. 使用 HTTPS
typescript
// 推荐
const config: NetworkConfig = {
baseUrl: "https://api.example.com/", // 使用 HTTPS
// ...
};
// 禁止
const config: NetworkConfig = {
baseUrl: "http://api.example.com/", // 不安全
// ...
};2. 验证服务器证书
确保验证服务器证书,防止中间人攻击。
3. 请求签名
对重要请求进行签名:
typescript
class SignInterceptor implements HttpInterceptor {
async onRequest(config: AxiosRequestConfig): Promise<AxiosRequestConfig> {
// 生成签名
const signature = generateSignature(config);
config.headers = config.headers || {};
config.headers['X-Signature'] = signature;
return config;
}
}输入验证
1. 验证用户输入
typescript
import { ValidationUtil } from "@core/util";
function validateUserInput(input: UserInput): boolean {
// 验证邮箱
if (!ValidationUtil.isEmail(input.email)) {
ToastUtils.showError("邮箱格式不正确");
return false;
}
// 验证手机号
if (!ValidationUtil.isPhone(input.phone)) {
ToastUtils.showError("手机号格式不正确");
return false;
}
// 验证密码强度
if (input.password.length < 8) {
ToastUtils.showError("密码长度不能少于 8 位");
return false;
}
return true;
}2. 防止 SQL 注入
使用参数化查询:
typescript
// 推荐:参数化查询
const user = await repository.findOne({
where: { username: username }
});
// 禁止:字符串拼接
const user = await repository.query(`SELECT * FROM users WHERE username = '${username}'`);认证与授权
1. Token 管理
typescript
// 保存 Token
async function saveToken(token: string): Promise<void> {
const encryptedToken = await encryptData(token);
await PreferencesUtil.put("token", encryptedToken);
}
// 获取 Token
async function getToken(): Promise<string | null> {
const encryptedToken = await PreferencesUtil.get("token", "");
if (!encryptedToken) return null;
return await decryptData(encryptedToken);
}
// 清除 Token
async function clearToken(): Promise<void> {
await PreferencesUtil.remove("token");
}2. Token 刷新
typescript
class AuthInterceptor implements HttpInterceptor {
async onResponse(response: AxiosResponse): Promise<AxiosResponse> {
// 检查 Token 是否过期
if (response.data.code === 401) {
// 刷新 Token
const newToken = await refreshToken();
if (newToken) {
// 重试请求
return await retryRequest(response.config);
} else {
// 跳转到登录页
NavigationService.replace("auth/login");
}
}
return response;
}
}3. 权限检查
typescript
function checkPermission(permission: string): boolean {
const appState = AppState.getInstance();
const user = appState.currentUser;
if (!user) return false;
return user.permissions.includes(permission);
}
// 使用
if (checkPermission("user:delete")) {
// 允许删除用户
} else {
ToastUtils.showError("无权限");
}日志安全
1. 不记录敏感信息
typescript
// 禁止
console.log("用户密码:", password);
console.log("Token:", token);
// 推荐
console.log("用户登录成功");2. 脱敏日志
对敏感信息进行脱敏:
typescript
function maskPhone(phone: string): string {
return phone.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2");
}
function maskEmail(email: string): string {
return email.replace(/(.{2}).*(@.*)/, "$1***$2");
}
// 使用
console.log("手机号:", maskPhone("13800138000")); // 138****8000
console.log("邮箱:", maskEmail("test@example.com")); // te***@example.com代码安全
1. 启用代码混淆
在 build-profile.json5 中启用代码混淆:
json5
{
"buildOption": {
"arkOptions": {
"obfuscation": {
"enable": true
}
}
}
}2. 移除调试代码
在生产环境中移除所有调试代码:
typescript
// 开发环境
if (__DEV__) {
console.log("调试信息");
}
// 生产环境:自动移除3. 安全的错误处理
typescript
try {
// 业务逻辑
} catch (error) {
// 不要暴露详细的错误信息给用户
console.error("内部错误:", error);
ToastUtils.showError("操作失败,请稍后重试");
}第三方库安全
1. 使用可信的库
只使用官方或可信的第三方库。
2. 定期更新
定期更新第三方库,修复已知的安全漏洞。
安全检查清单
在发布前进行安全检查:
- [ ] 无硬编码密钥
- [ ] 敏感数据已加密
- [ ] 使用 HTTPS
- [ ] 验证用户输入
- [ ] 防止 SQL 注入
- [ ] 防止 XSS 攻击
- [ ] Token 安全管理
- [ ] 权限检查完整
- [ ] 日志不包含敏感信息
- [ ] 启用代码混淆
- [ ] 移除调试代码
- [ ] 第三方库安全
注意事项
- 安全第一:安全性永远是第一位的
- 持续关注:持续关注安全动态
- 及时修复:发现安全问题及时修复