Skip to content

安全规范

概述

本文档提供了 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 安全管理
  • [ ] 权限检查完整
  • [ ] 日志不包含敏感信息
  • [ ] 启用代码混淆
  • [ ] 移除调试代码
  • [ ] 第三方库安全

注意事项

  1. 安全第一:安全性永远是第一位的
  2. 持续关注:持续关注安全动态
  3. 及时修复:发现安全问题及时修复