• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 数据库加密 (C/C++)
2<!--Kit: ArkData-->
3<!--Subsystem: DistributedDataManager-->
4<!--Owner: @baijidong-->
5<!--Designer: @widecode; @htt1997-->
6<!--Tester: @yippo; @logic42-->
7<!--Adviser: @ge-yafang-->
8
9## 场景介绍
10
11为了增强数据库的安全性,数据库提供了安全的加密功能,以有效保护存储的内容。
12通过数据库加密,实现了数据库数据存储的保密性和完整性要求,使得数据库以密文方式存储并在密态方式下工作,确保了数据安全。
13
14加密后的数据库只能通过接口进行访问,无法通过其它方式打开数据库文件。数据库的加密属性在创建数据库时确认,无法变更。
15
16当前仅支持使用关系型数据库(C/C++)进行数据库加密。
17
18## 开发步骤
19
20关系型数据库通过调用OH_Rdb_SetEncrypted方法来设置是否加密。isEncrypted参数为true时表示加密,为false时表示不加密,默认不加密。
21
22当isEncrypted为true时,可调用OH_Rdb_SetCryptoParam方法设置自定义的加密/解密密钥和算法等参数。
23
24
25
26
27
281. CMakeLists.txt中添加以下lib。
29
30    ```txt
31    libnative_rdb_ndk.z.so
32    ```
33
342. 导入头文件。
35
36    ```c
37    #include "database/rdb/relational_store.h"
38    ```
39
403. 针对是否配置自定义加密/解密参数,有如下两种场景:
41
42    * 场景1:不配置自定义加密/解密参数,此时会使用默认的配置进行数据库的加密/解密。
43
44        ```c
45        OH_Rdb_ConfigV2* config = OH_Rdb_CreateConfig();
46        OH_Rdb_SetDatabaseDir(config, "/data/storage/el2/database");
47        OH_Rdb_SetArea(config, RDB_SECURITY_AREA_EL2);
48        OH_Rdb_SetBundleName(config, "com.example.nativedemo");
49        OH_Rdb_SetStoreName(config, "RdbTest.db");
50        OH_Rdb_SetSecurityLevel(config, OH_Rdb_SecurityLevel::S3);
51        // 设置为使用加密方式创建或打开数据库
52        OH_Rdb_SetEncrypted(config, true);
53
54        int errCode = 0;
55
56        // 获取OH_Rdb_Store实例
57        OH_Rdb_Store *store = OH_Rdb_CreateOrOpen(config, &errCode);
58        ```
59
60    * 场景2:使用OH_Rdb_SetCryptoParam接口配置加密参数,此时会使用开发者自定义的密钥和算法参数进行数据库的加密/解密。
61
62      如果开发者不关心加密算法及参数,使用默认加密配置即可,无需创建和配置自定义加密参数。
63
64        ```c
65        OH_Rdb_ConfigV2* config = OH_Rdb_CreateConfig();
66        OH_Rdb_SetDatabaseDir(config, "/data/storage/el2/database");
67        OH_Rdb_SetArea(config, RDB_SECURITY_AREA_EL2);
68        OH_Rdb_SetStoreName(config, "RdbTestConfigEncryptParam.db");
69        OH_Rdb_SetSecurityLevel(config, OH_Rdb_SecurityLevel::S3);
70        OH_Rdb_SetBundleName(config, "com.example.nativedemo");
71        // 设置为使用加密方式创建或打开数据库
72        OH_Rdb_SetEncrypted(config, true);
73        // 创建自定义加密参数对象
74        OH_Rdb_CryptoParam *cryptoParam = OH_Rdb_CreateCryptoParam();
75
76        uint8_t key[6] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36 };
77        // 使用指定的密钥打开加密数据库。不指定则由数据库负责生成并保存密钥,并使用生成的密钥。
78        OH_Crypto_SetEncryptionKey(cryptoParam, key, 6);
79        // 设置KDF算法迭代次数。迭代次数必须大于零。不指定或等于零则使用默认值10000和默认加密算法。
80        OH_Crypto_SetIteration(cryptoParam, 64000);
81        // 设置加密算法,如不设置默认为AES_256_GCM
82        OH_Crypto_SetEncryptionAlgo(cryptoParam, Rdb_EncryptionAlgo::RDB_AES_256_CBC);
83        // 设置HMAC算法,如不设置默认为SHA256
84        OH_Crypto_SetHmacAlgo(cryptoParam, RDB_HMAC_SHA512);
85        // 设置KDF算法,如不设置默认为SHA256
86        OH_Crypto_SetKdfAlgo(cryptoParam, RDB_KDF_SHA512);
87        // 设置打开加密数据库时使用的页大小,须为1024到65536之间的整数且为2的幂,如不设置默认为1024
88        OH_Crypto_SetCryptoPageSize(cryptoParam, 4096);
89        // 设置自定义加密参数
90        OH_Rdb_SetCryptoParam(config, cryptoParam);
91
92        int errCode = 0;
93        OH_Rdb_Store *store = OH_Rdb_CreateOrOpen(config, &errCode);
94        // 销毁自定义加密参数对象
95        OH_Rdb_DestroyCryptoParam(cryptoParam);
96        OH_Rdb_CloseStore(store);
97        ```
98