HarmonyOS 鸿蒙Next中应用如何安全存储用户密码或支付密钥?

HarmonyOS 鸿蒙Next中应用如何安全存储用户密码或支付密钥? 我们的金融 App 需要本地缓存用户 PIN 码。普通 Preferences 加密够用吗?还是必须用硬件级保护?

5 回复

隐私信息建议使用关键资产存储服务。

【背景知识】

【解决方案】

解决方案一:关键资产存储服务提供一系列接口用于短敏感数据包括密码类、Token类以及其他关键明文等长度较短的敏感信息的安全存储及管理功能。该服务使用AES256-GCM加密,数据存储在安全环境(如TEE),即使系统被攻破也难以泄露。详细的开发案例可参考

解决方案二:应用首选项的持久化文件保存在应用沙箱内部,键值对存储,适合小数据量,但默认卸载应用时数据清除。详细的开发案例可参考

更多关于HarmonyOS 鸿蒙Next中应用如何安全存储用户密码或支付密钥?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


用户首选项的持久化文件存储在preferencesDir路径下,创建preferences对象前,需要保证preferencesDir路径可读写。持久化文件存储路径中的加密等级会影响文件的可读写状态,路径访问限制详见应用文件目录与应用文件路径

preferences目录结构:<路径前缀>/<加密等级>/base/haps/<module-name>/preferences

文件加密分区等级,保证应用在不同场景下的数据安全。开发者可以根据应用的具体需求选择合适的加密等级,以保护用户的数据安全。

名称 说明
EL1 0 设备级加密区,设备开机后可访问的数据区。
元服务API:从API version 11开始,该接口支持在元服务中使用。
EL2 1 用户级加密区,设备开机,首次输入密码后才能够访问的数据区。
元服务API:从API version 11开始,该接口支持在元服务中使用。
EL3 2 用户级加密区,不同场景的文件权限如下:
已打开文件:锁屏时,可读写;解锁后,可读写。
未打开文件:锁屏时,不可打开、不可读写;解锁后,可打开、可读写。
创建新文件:锁屏时,可创建、可打开、可写不可读;解锁后,可创建、可打开、可读写。
元服务API:从API version 11开始,该接口支持在元服务中使用。
EL4 3 用户级加密区,不同场景的文件权限如下:
已打开文件:锁屏时,不可读写;解锁后,可读写。
未打开文件:锁屏时,不可打开、不可读写;解锁后,可打开、可读写。
创建新文件:锁屏时,不可创建;解锁后,可创建、可打开、可读写。
元服务API:从API version 11开始,该接口支持在元服务中使用。
EL5 4 应用级加密区,不同场景的文件权限如下:
已打开文件:锁屏时,可读写;解锁后,可读写。
未打开文件:锁屏时,调用Access接口获取保留密钥后,可打开、可读写,否则不可打开、不可读写;解锁后,可打开、可读写。
创建新文件:锁屏时,可创建、可打开、可读写;解锁后,可创建、可打开、可读写。
元服务API:从API version 12开始,该接口支持在元服务中使用。


 如果是普通的数据放在preferences里还是很安全的,如果怕被窃取,可以采用存储加密后的PIN码,每次使用的时候再动态解密,这样即便泄漏别人也无法获取真实的PIN码。

在HarmonyOS Next中,应用应使用系统提供的安全存储能力。通过KeyStore和CryptoManager接口,可将密码或支付密钥等敏感数据加密后存储于TEE(可信执行环境)或SE(安全芯片)中。密钥材料由系统硬件保护,应用仅能通过密钥别名访问,无法直接读取原始数据。加解密运算在安全环境中执行,确保密钥不出TEE/SE。

对于金融类App,HarmonyOS Next提供了更严格的安全方案。普通Preferences的加密(如加密Preferences)虽然提供基础保护,但PIN码、支付密钥等高敏感数据建议使用更高安全等级。

推荐使用华为统一密钥库系统(HUKS)配合硬件级安全。HUKS能利用设备内置安全芯片(如TEE/SE)生成和存储密钥,确保密钥不出安全环境。具体可考虑:

  1. 使用密钥认证访问控制:通过生物识别或锁屏密码认证后,才能使用密钥解密数据。
  2. 密钥与设备绑定:防止导出到其他设备。
  3. 敏感操作在安全环境执行:如加解密在TEE内完成。

若需本地存储加密后的PIN码,可用HUKS生成密钥,结合加密Preferences存储密文。但注意,PIN码本身最好通过用户实时认证获取,避免长期存储。

对于金融场景,硬件级保护是必要的,能有效防御物理攻击和恶意软件。建议根据数据敏感度,采用HUKS的相应安全等级(如S4级别)。

回到顶部