鸿蒙Next中如何保存token

在鸿蒙Next开发中,如何安全地保存用户的token?目前尝试了Preferences和数据库存储,但担心敏感信息泄露风险。请问官方推荐哪种存储方式?是否有加密存储的最佳实践?

2 回复

鸿蒙Next里存token?简单!用Preferences存,安全又省心。
代码示例:

Preferences preferences = Preferences.getInstance(context);
preferences.putString("token", "你的token");
preferences.flushSync(); // 同步保存

记得别把token写进日志,不然黑客请你喝咖啡☕️!

更多关于鸿蒙Next中如何保存token的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next(HarmonyOS NEXT)中,保存Token通常使用安全存储机制,推荐使用@ohos.security.cryptoFramework进行加密存储,或使用Preferences结合加密处理。以下是具体实现方法:


1. 使用 Preferences 存储(简单场景)

适用于非高敏感数据,可结合加密增强安全性:

import { preferences } from '@kit.ArkData';

// 存储Token
async function saveToken(token: string) {
  try {
    await preferences.putString('token_key', token);
    await preferences.flush(); // 提交保存
  } catch (err) {
    console.error('Save token failed:', err);
  }
}

// 读取Token
async function getToken(): Promise<string> {
  try {
    return await preferences.getString('token_key', '');
  } catch (err) {
    console.error('Get token failed:', err);
    return '';
  }
}

2. 加密存储(推荐方案)

使用cryptoFramework对Token加密后存储:

import { cryptoFramework } from '@ohos.security.cryptoFramework';
import { preferences } from '@kit.ArkData';

// 生成密钥(实际应用需安全保存密钥)
async function generateKey(): Promise<cryptoFramework.SymKey> {
  // 示例:生成AES密钥
  const genGenerator = cryptoFramework.createSymKeyGenerator('AES256');
  return await genGenerator.generateSymKey();
}

// 加密并存储
async function encryptAndSaveToken(token: string, key: cryptoFramework.SymKey) {
  const cipher = cryptoFramework.createCipher('AES256|GCM|PKCS7');
  await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, key, null);
  const encryptedData = await cipher.doFinal({ data: new Uint8Array([...token]).buffer });
  
  // 保存加密后的数据(需转为Base64或Hex)
  const encryptedBase64 = bufferToBase64(encryptedData.data);
  await preferences.putString('encrypted_token', encryptedBase64);
}

// 解密Token
async function decryptToken(key: cryptoFramework.SymKey): Promise<string> {
  const encryptedBase64 = await preferences.getString('encrypted_token', '');
  const decipher = cryptoFramework.createCipher('AES256|GCM|PKCS7');
  await decipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, key, null);
  
  const encryptedData = base64ToBuffer(encryptedBase64);
  const decryptedData = await decipher.doFinal({ data: encryptedData });
  return new TextDecoder().decode(decryptedData.data);
}

3. 注意事项

  • 敏感数据:Token属于敏感信息,务必加密存储。
  • 密钥管理:加密密钥需通过安全模块(如KeyStore)保护,避免硬编码。
  • 生命周期:根据业务需求设置Token有效期,定期更新。

总结

  • 普通场景:直接用Preferences存储。
  • 安全场景:结合cryptoFramework加密后存储。
  • 关键点:永远不要明文存储Token,并遵循最小权限原则。
回到顶部