Skip to content

数据加密

鸿蒙数据加密方案:CryptoArchitectureKit、KeyStore、加密存储。


1. 加密方案对比

方案用途适用场景
CryptoArchitectureKit通用加密算法AES、RSA、SHA 等
KeyStore密钥管理安全存储密钥
AssetStore安全存储应用卸载后保留
Preferences 加密配置加密Token 等小数据

2. CryptoArchitectureKit

2.1 AES 对称加密

typescript
import { crypto } from '@kit.CryptoArchitectureKit'

// 生成 AES 密钥
let aesKey = crypto.generateKey({
    algorithm: crypto.Algorithm.AES_256_GCM,
    keySize: 256,
    exportable: false  // 密钥不可导出
})

// 加密
let encrypted = crypto.encrypt({
    key: aesKey,
    data: new TextEncoder().encode('sensitive data'),
    algorithm: crypto.Algorithm.AES_256_GCM
})

// 解密
let decrypted = crypto.decrypt({
    key: aesKey,
    data: encrypted,
    algorithm: crypto.Algorithm.AES_256_GCM
})

let result = new TextDecoder().decode(decrypted)
console.log('解密结果:', result)

2.2 RSA 非对称加密

typescript
// 生成 RSA 密钥对
let keyPair = crypto.generateKeyPair({
    algorithm: crypto.Algorithm.RSA_2048
})

// 公钥加密
let encrypted = crypto.encrypt({
    key: keyPair.publicKey,
    data: new TextEncoder().encode('secret message'),
    algorithm: crypto.Algorithm.RSA_PKCS1_OAEP
})

// 私钥解密
let decrypted = crypto.decrypt({
    key: keyPair.privateKey,
    data: encrypted,
    algorithm: crypto.Algorithm.RSA_PKCS1_OAEP
})

2.3 SHA 哈希

typescript
// SHA-256 哈希
let hash = crypto.hash({
    data: new TextEncoder().encode('password'),
    algorithm: crypto.Algorithm.SHA_256
})

// 结果是一个 Uint8Array,通常转十六进制
function toHexString(bytes: Uint8Array): string {
    return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('')
}

let hashStr = toHexString(hash)
console.log('哈希值:', hashStr)
// 例:5e884898da28047151d0e568...

3. KeyStore 密钥管理

3.1 创建密钥

typescript
import { keyStorage } from '@kit.ArkTS'

// 创建密钥库
let keyStore = await keyStorage.getKeyStore()

// 生成密钥
let keyAlias = await keyStore.generateKey({
    alias: 'app_key',
    algorithm: keyStorage.KeyAlgorithm.AES_256,
    keySize: 256,
    keyGenSpec: {
        blockMode: keyStorage.KeyGenParameter.BlockMode.GCM,
        padding: keyStorage.KeyGenParameter.Padding.NONE
    }
})

3.2 使用密钥

typescript
// 获取密钥
let key = await keyStore.getKey('app_key')

// 用密钥加密数据
let encrypted = crypto.encrypt({
    key: key,
    data: sensitiveData,
    algorithm: crypto.Algorithm.AES_256_GCM
})

// 存储加密后的数据
let preferences = await preferences.getPreferences(context, { name: 'secure' })
await preferences.put('encryptedData', encrypted)
await preferences.commit()

4. 密码存储最佳实践

❌ 错误做法:
├─ 明文存储密码
├─ 使用 MD5(已不安全)
├─ 硬编码密码在代码中
└─ 使用自定义加密算法

✅ 正确做法:
├─ 密码哈希存储(SHA-256 + salt)
├─ 使用 KeyStore 管理密钥
├─ 敏感数据用 AES 加密
└─ 密钥不硬编码

5. 面试高频考点

Q1: 鸿蒙数据加密方案有哪些?

回答:CryptoArchitectureKit(AES/RSA/SHA 算法)、KeyStore(密钥管理)、AssetStore(安全存储)。敏感数据 AES 加密后存储,密码 SHA-256 哈希。

Q2: KeyStore 的作用?

回答:安全存储和管理加密密钥,密钥不导出、不硬编码在代码中。


🐱 小猫提示:数据加密记住 "AES 加密存储、SHA-256 哈希、KeyStore 管理密钥、密码不硬编码"