以下为 HarmonyOS 5端侧数据库AES-256加密防护的自动化测试方案,包含加密验证、密钥安全测试及性能分析的完整代码实现:
1. 测试架构设计
2. 核心测试模块
2.1 加密数据库配置
// encrypted-db.ets
const DB_CONFIG = {
name: 'secure_db',
version: 1,
encryption: {
algorithm: 'AES-256-GCM',
key: KeyGenerator.deriveFromPassword('user123!', {
iterations: 10000,
salt: 'harmony_salt'
})
},
tables: [
{
name: 'users',
columns: [
{ name: 'id', type: 'integer', primaryKey: true },
{ name: 'name', type: 'text', encrypted: true },
{ name: 'ssn', type: 'text', encrypted: true }
]
}
]
};
2.2 自动化测试桩数据
// test-data.ets
function generateTestData(): any[] {
return [
{ id: 1, name: '张三', ssn: '320****1990' },
{ id: 2, name: '李四', ssn: '510****1985' },
{ id: 3, name: '王五', ssn: '210****2000' }
];
}
3. 加密验证测试
3.1 写入加密验证
// write-test.ets
test('数据写入时应自动加密', async () => {
const db = await Database.open(DB_CONFIG);
const testData = generateTestData()[0];
await db.insert('users', testData);
const rawData = await db.rawQuery(
'SELECT name, ssn FROM users WHERE id = 1'
);
// 验证密文不等于明文
expect(rawData[0].name).not.toBe(testData.name);
expect(rawData[0].ssn).not.toBe(testData.ssn);
// 验证密文格式
expect(rawData[0].name).toMatch(/^[A-Z0-9+=/]{32,}$/i);
});
3.2 解密读取验证
// read-test.ets
test('数据读取时应自动解密', async () => {
const db = await Database.open(DB_CONFIG);
const testData = generateTestData()[0];
const result = await db.select('users', {
where: { id: 1 }
});
// 验证解密后数据一致
expect(result[0].name).toBe(testData.name);
expect(result[0].ssn).toBe(testData.ssn);
});
4. 密钥安全测试
4.1 密钥存储验证
// key-security.ets
test('密钥不应明文存储', () => {
const keyPath = '/data/data/com.example.app/databases/secure_db.key';
const keyFile = readSystemFile(keyPath);
// 验证密钥文件是否加密
expect(isEncrypted(keyFile)).toBeTruthy();
// 验证内存中的密钥保护
expect(MemoryProtection.isProtected(DB_CONFIG.encryption.key))
.toBeTruthy();
});
4.2 密钥轮换测试
// key-rotation.ets
test('密钥轮换后应能解密旧数据', async () => {
const oldKey = DB_CONFIG.encryption.key;
const db = await Database.open(DB_CONFIG);
// 插入测试数据
await db.insert('users', generateTestData()[0]);
// 模拟密钥轮换
const newKey = KeyGenerator.generate();
await db.rotateKey(oldKey, newKey);
// 验证数据可读
const result = await db.select('users', { where: { id: 1 } });
expect(result[0].name).toBe('张三');
});
5. 完整性校验
5.1 密文篡改检测
// tamper-test.ets
test('篡改密文应拒绝解密', async () => {
const db = await Database.open(DB_CONFIG);
await db.insert('users', generateTestData()[1]);
// 篡改数据库文件
const dbFile = '/data/data/com.example.app/databases/secure_db';
modifyRandomBytes(dbFile, { offset: 1024, length: 16 });
// 尝试读取应抛出异常
await expectAsync(
db.select('users', { where: { id: 2 } })
).toBeRejectedWithError(/integrity check failed/);
});
5.2 GCM认证标签验证
// gcm-test.ets
test('无效GCM标签应拒绝解密', async () => {
const db = await Database.open(DB_CONFIG);
await db.insert('users', generateTestData()[2]);
// 获取原始密文
const cipherText = await db.rawQuery(
'SELECT name FROM users WHERE id = 3'
);
// 修改GCM认证标签
const tampered = cipherText[0].name.slice(0, -12) + 'AAAAAAAAAAAA';
await db.rawExec(
'UPDATE users SET name = ? WHERE id = 3',
[tampered]
);
await expectAsync(
db.select('users', { where: { id: 3 } })
).toBeRejectedWithError(/authentication tag mismatch/);
});
6. 性能基准测试
6.1 加密吞吐量测试
// throughput-test.ets
test('AES-256-GCM吞吐量应≥50MB/s', async () => {
const testData = generateLargeData(10 * 1024 * 1024); // 10MB数据
const db = await Database.open(DB_CONFIG);
const start = performance.now();
await db.insert('users', {
id: 999,
name: 'perf_test',
ssn: testData
});
const duration = performance.now() - start;
const throughput = (10 / (duration / 1000)).toFixed(2);
expect(throughput).toBeGreaterThan(50); // MB/s
});
6.2 延迟测试
// latency-test.ets
test('单条记录加解密延迟应<5ms', async () => {
const db = await Database.open(DB_CONFIG);
const testData = generateTestData()[0];
const encryptStart = performance.now();
await db.insert('users', testData);
const encryptTime = performance.now() - encryptStart;
const decryptStart = performance.now();
await db.select('users', { where: { id: 1 } });
const decryptTime = performance.now() - decryptStart;
expect(encryptTime).toBeLessThan(5);
expect(decryptTime).toBeLessThan(5);
});
7. 安全边界测试
7.1 无效密钥测试
// invalid-key.ets
test('使用错误密钥应拒绝访问', async () => {
const db = await Database.open(DB_CONFIG);
await db.insert('users', generateTestData()[0]);
// 尝试用错误密钥打开
const fakeConfig = { ...DB_CONFIG };
fakeConfig.encryption.key = 'wrong_key_xxxxxxxx';
await expectAsync(
Database.open(fakeConfig)
).toBeRejectedWithError(/decryption failed/);
});
7.2 内存残留检测
// memory-dump.ets
test('内存中不应残留明文', async () => {
const db = await Database.open(DB_CONFIG);
const sensitiveData = generateTestData()[0].ssn;
await db.insert('users', generateTestData()[0]);
await db.select('users', { where: { id: 1 } });
// 扫描进程内存
const memory = dumpProcessMemory();
expect(memory.includes(sensitiveData)).toBeFalsy();
});
8. 自动化测试套件
8.1 完整测试流程
// test-suite.ets
describe('AES-256数据库加密', () => {
beforeAll(async () => {
await Database.create(DB_CONFIG);
});
afterAll(async () => {
await Database.delete('secure_db');
});
test('写入加密验证', () => testWriteEncryption());
test('读取解密验证', () => testReadDecryption());
test('密钥安全测试', () => testKeySecurity());
test('完整性校验测试', () => testIntegrity());
test('性能基准测试', () => testPerformance());
});
8.2 持续集成配置
# .gitlab-ci.yml
stages:
- security_test
aes256_test:
stage: security_test
script:
- npm install
- npm run test:encryption
artifacts:
paths:
- test-results/security/
reports:
junit: test-results/security/report.xml
9. 测试报告生成
9.1 安全评估报告
// report-generator.ets
function generateSecurityReport(results: TestResult[]) {
const vulnerabilities = results.filter(r => !r.passed);
return {
timestamp: new Date(),
testedAlgorithm: 'AES-256-GCM',
keyStrength: '256-bit',
passedTests: results.length - vulnerabilities.length,
vulnerabilities: vulnerabilities.map(v => ({
testCase: v.name,
severity: v.severity || 'medium',
description: v.err.message
})),
compliance: {
'ISO/IEC 18033-3': vulnerabilities.length === 0,
'FIPS 197': vulnerabilities.length === 0
}
};
}
9.2 性能报告示例
{
"encryptionThroughput": "78.45 MB/s",
"averageEncryptLatency": "3.21 ms",
"averageDecryptLatency": "2.89 ms",
"memoryUsage": "4.2 MB",
"compliance": {
"OWASP Crypto": true,
"PCI DSS": true
}
}
10. 关键安全指标
| 测试项 | 达标要求 | 检测方法 |
|---|---|---|
| 加密强度 | AES-256-GCM | 算法配置验证 |
| 密钥存储安全 | 无明文存储 | 内存/存储扫描 |
| 解密完整性 | GCM标签验证 | 密文篡改测试 |
| 内存安全 | 无敏感数据残留 | 进程内存分析 |
| 性能基准 | ≥50MB/s吞吐量 | 大数据集测试 |
11. 扩展测试能力
11.1 侧信道攻击测试
// side-channel.ets
test('加密操作不应泄露时间信息', async () => {
const delays = [];
for (let i = 0; i < 100; i++) {
const data = generateTestData()[i % 3];
const start = performance.now();
await db.insert('users', data);
delays.push(performance.now() - start);
}
// 时间差异应小于±5%
const avg = delays.reduce((a,b) => a + b) / delays.length;
const maxDeviation = Math.max(...delays.map(d => Math.abs(d - avg)));
expect(maxDeviation / avg).toBeLessThan(0.05);
});
11.2 模糊测试
// fuzz-test.ets
test('异常输入处理', async () => {
const malformedInputs = [
null,
Buffer.alloc(1024 * 1024), // 1MB空数据
{ toString: () => 'malicious' },
new Date().toISOString()
];
for (const input of malformedInputs) {
await expectAsync(
db.insert('users', { id: 999, name: input, ssn: input })
).toBeRejected();
}
});
通过本测试方案可实现:
- 100% 加密算法合规验证
- 毫秒级 性能监控
- 军工级 安全审计
- 自动化 持续测试