👋 你好,欢迎来到我的博客!我是【菜鸟不学编程】
   我是一个正在奋斗中的职场码农,步入职场多年,正在从“小码农”慢慢成长为有深度、有思考的技术人。在这条不断进阶的路上,我决定记录下自己的学习与成长过程,也希望通过博客结识更多志同道合的朋友。
  
  🛠️ 主要方向包括 Java 基础、Spring 全家桶、数据库优化、项目实战等,也会分享一些踩坑经历与面试复盘,希望能为还在迷茫中的你提供一些参考。
  💡 我相信:写作是一种思考的过程,分享是一种进步的方式。
  
   如果你和我一样热爱技术、热爱成长,欢迎关注我,一起交流进步!

前言

随着移动应用的普及,数据安全变得越来越重要,尤其是涉及用户隐私和敏感信息的应用。在鸿蒙操作系统中,为了确保本地存储的数据安全,提供了多种加密与数据防护方案。本文将介绍如何在鸿蒙应用中实现本地数据库加密与数据防护,具体涵盖 SQLite 加密方式(SQLCipher)接入方案使用 Harmony Secure Store 保护密钥敏感字段脱敏存储策略权限控制与访问审计机制,并通过一个实际案例来展示如何构建一个安全的记账本应用。

1. SQLite 加密方式(SQLCipher)接入方案

SQLCipher 简介

SQLCipher 是一个开源的 SQLite 数据库加密库,通过对数据库文件进行加密,保护存储在本地的敏感数据不被未授权访问。SQLCipher 使用 AES-256 位加密算法,可以加密整个数据库的文件。

在鸿蒙中,我们可以使用 SQLCipher 为 SQLite 数据库加密,确保所有存储在本地的数据都经过加密,防止数据泄露。

SQLCipher 集成方案

  1. 添加依赖:在鸿蒙项目中,首先需要将 SQLCipher 集成到项目中。可以通过 JNI 调用 SQLCipher 的 C++ 库,或者使用一些现成的 Java 接口库。

  2. 初始化数据库加密:在打开 SQLite 数据库时,需要提供加密密钥,并使用 SQLCipher 打开数据库文件。

示例代码:SQLCipher 加密数据库的接入
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;
import android.content.Context;

public class EncryptedDatabaseHelper extends SQLiteOpenHelper {

    public EncryptedDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建表
        db.execSQL("CREATE TABLE users (id INTEGER PRIMARY KEY, username TEXT, password TEXT)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS users");
        onCreate(db);
    }

    public static SQLiteDatabase getEncryptedDatabase(Context context, String dbName, String password) {
        // 初始化 SQLCipher
        SQLiteDatabase.loadLibs(context);
        return SQLiteDatabase.openOrCreateDatabase(context.getDatabasePath(dbName), password, null);
    }
}

在这个例子中,我们使用 SQLCipher 打开数据库时,传入了数据库的密码,确保数据在存储时是加密的。

密码管理

为了避免硬编码数据库密码,可以结合 Harmony Secure Store 来安全存储和管理加密密码。

2. 使用 Harmony Secure Store 保护密钥

Harmony Secure Store 是鸿蒙系统中提供的一种安全存储解决方案,用于安全存储敏感数据,如加密密钥、密码、令牌等。Secure Store 采用高强度的加密算法来保护存储的数据,即使设备被盗,也可以保证密钥和敏感信息的安全。

使用 Harmony Secure Store 存储密钥

  1. 存储密钥:在应用中生成的加密密钥或用户凭证可以通过 Secure Store 存储。
  2. 访问密钥:应用可以从 Secure Store 安全地获取密钥,用于数据库加密或其他加密操作。
示例代码:使用 Secure Store 存储和访问密钥
import ohos.security.keystore.KeyStore;
import ohos.security.keystore.KeyStoreException;

public class SecureStoreHelper {

    private static final String KEY_ALIAS = "appSecretKey";

    // 存储密钥
    public static void storeKey(String key) throws KeyStoreException {
        KeyStore keyStore = KeyStore.getInstance(KeyStore.DEFAULT_PROVIDER);
        keyStore.setAlias(KEY_ALIAS, key);
    }

    // 获取密钥
    public static String getKey() throws KeyStoreException {
        KeyStore keyStore = KeyStore.getInstance(KeyStore.DEFAULT_PROVIDER);
        return keyStore.getAlias(KEY_ALIAS);
    }
}

在这个例子中,我们使用 KeyStore 类存储和获取密钥。storeKey 方法将密钥存储到 Secure Store 中,getKey 方法用来从 Secure Store 中获取密钥。

3. 敏感字段脱敏存储策略

在存储敏感信息时,除了加密整个数据库或文件外,脱敏存储策略也是一种常见的保护措施。脱敏处理指的是在数据存储前,对敏感信息进行格式化、部分隐藏或替换。

脱敏存储常见策略

  1. 数据部分隐藏:例如,将用户的银行卡号存储为 **** 1234,只显示最后四位。
  2. 加密部分字段:仅对极为敏感的信息(如密码、身份信息等)进行加密,而其他字段使用明文存储。
  3. 数据掩码:使用掩码隐藏敏感字段,如将身份证号存储为 ********123456
示例代码:银行卡号脱敏存储
public class DataMasking {

    // 脱敏银行卡号
    public static String maskCardNumber(String cardNumber) {
        if (cardNumber != null && cardNumber.length() > 4) {
            return "**** " + cardNumber.substring(cardNumber.length() - 4);
        }
        return cardNumber;
    }
}

在这个示例中,maskCardNumber 方法将银行卡号的前面部分隐藏,仅保留后四位。

4. 权限控制与访问审计机制

在设计安全系统时,除了加密和脱敏,权限控制访问审计也是确保数据安全的必要措施。通过严格的权限控制,只有授权的用户才能访问敏感数据。同时,访问审计可以记录和分析用户的操作,帮助检测潜在的安全漏洞和不当行为。

权限控制

  1. 基于角色的权限管理:通过分配不同的角色,定义不同的权限。例如,普通用户只能查看数据,而管理员可以修改数据。
  2. 细粒度权限控制:对不同数据进行权限控制,不同用户可以访问不同级别的数据。

访问审计

  1. 记录所有敏感操作:对所有访问敏感数据的操作进行记录,包括读取、修改、删除等,确保操作可追溯。
  2. 审计日志分析:定期分析审计日志,识别潜在的安全威胁。
示例代码:权限控制与访问审计
public class AccessControl {

    public static boolean hasPermission(String userRole, String operation) {
        // 简单的角色权限检查
        if ("ADMIN".equals(userRole) && "WRITE".equals(operation)) {
            return true;
        }
        return false;
    }

    public static void auditAccess(String user, String action) {
        System.out.println("User " + user + " performed action: " + action + " at " + System.currentTimeMillis());
    }
}

在这个示例中,我们通过 hasPermission 方法检查用户角色是否有权限执行某个操作,auditAccess 方法记录每次用户的敏感操作。

5. 案例:构建安全记账本App

为了实现一个安全的记账本应用,我们需要结合以上几种技术进行设计和实现:

  • 数据库加密:使用 SQLCipher 对 SQLite 数据库进行加密。
  • 密钥保护:使用 Harmony Secure Store 存储数据库的加密密钥。
  • 数据脱敏:对记账数据中的敏感信息(如支付卡号、用户名等)进行脱敏存储。
  • 权限控制:对不同用户角色进行权限控制,确保只有授权用户可以访问敏感数据。
  • 访问审计:记录用户的每次操作,保证操作可追溯。

安全记账本App 示例架构

  1. 数据库层:使用加密的 SQLite 数据库存储用户的记账信息,所有敏感字段(如账户信息)采用脱敏或加密存储。
  2. 加密与密钥存储:利用 SQLCipher 加密数据库,使用 Harmony Secure Store 存储和保护数据库加密密钥。
  3. 权限管理与审计:实现基于角色的权限控制,并记录所有访问敏感数据的操作,供安全审计使用。

总结

通过以上的加密和数据防护措施,我们可以有效保护应用中的敏感信息,避免数据泄露或滥用。结合 SQLCipher 加密数据库、Harmony Secure Store 存储密钥、数据脱敏 存储策略、权限控制与访问审计 机制,能够构建一个安全可靠的记账本应用。在实际开发中,确保数据的安全性是每个开发者的责任,必须在设计和实现阶段考虑到这些安全防护措施。

📝 写在最后

如果你觉得这篇文章对你有帮助,或者有任何想法、建议,欢迎在评论区留言交流!你的每一个点赞 👍、收藏 ⭐、关注 ❤️,都是我持续更新的最大动力!

我是一个在代码世界里不断摸索的小码农,愿我们都能在成长的路上越走越远,越学越强!

感谢你的阅读,我们下篇文章再见~👋

✍️ 作者:某个被流“治愈”过的 Java 老兵
📅 日期:2025-07-25
🧵 本文原创,转载请注明出处。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐