本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。
在医疗信息化快速发展的今天,医疗数据的安全至关重要。医疗数据包含患者的个人隐私信息、健康状况、诊断结果等敏感内容,一旦泄露,将对患者造成严重影响。基于华为鸿蒙HarmonyOS Next系统,我们可以利用Device Certificate Kit等工具构建一套强大的医疗数据防泄漏与身份认证方案。
一、场景描述
在医疗环境中,存在多种设备和应用需要处理医疗数据,如医疗监测设备(如血糖仪、血压计、心电图机等)、医院信息系统(HIS)、电子病历系统(EMR)、远程医疗应用等。这些设备和应用之间需要进行数据交互,同时要确保数据的安全性和隐私性。
- 医疗设备数据传输安全需求
- 医疗监测设备需要将采集到的患者生理数据(如血糖值、血压值、心电图数据等)准确、安全地传输到医院信息系统或医生的移动设备上。在传输过程中,要防止数据被窃取、篡改或伪造,确保数据的完整性和真实性。
- 不同类型的医疗设备可能需要与不同的接收方进行通信,例如,病房内的医疗设备可能需要将数据传输到科室的服务器,而便携式医疗设备可能需要通过无线网络将数据传输到远程医疗中心。因此,需要建立安全的通信通道,适应不同的通信场景。
- 医疗应用数据存储与访问安全需求
- 电子病历系统等医疗应用需要安全地存储患者的医疗数据,防止数据泄露。数据在存储时应进行加密处理,确保即使存储介质被非法获取,数据也无法被轻易解读。
- 对于医疗数据的访问,需要进行严格的权限控制。不同角色的人员(如医生、护士、药剂师、行政人员等)应根据其工作职责被授予不同的访问权限。例如,医生可以查看和修改患者的诊断信息,护士可以查看患者的护理记录,而行政人员可能只能访问患者的基本信息用于统计和管理目的。
二、架构设计
为了满足医疗数据安全的需求,我们设计了一个基于HarmonyOS Next的安全架构,主要依赖Device Certificate Kit和Data Protection Kit来实现。
- Device Certificate Kit
- 负责医疗设备的身份认证。为每个医疗设备生成唯一的证书,证书中包含设备的身份信息(如设备型号、序列号、制造商等)和公钥。在设备与其他系统或设备进行通信时,通过证书链校验机制验证设备的真实性,确保只有合法的医疗设备才能接入医疗网络。
- 提供安全的密钥管理功能。在设备证书生成过程中,同时生成公私钥对,私钥安全存储在设备中,用于设备对数据进行签名和加密等操作,公钥则用于其他设备或系统对设备进行身份验证和数据加密通信。
- Data Protection Kit
- 用于医疗数据的加密存储。提供多种加密算法和密钥管理策略,对存储在本地或云端的医疗数据进行加密处理。可以根据数据的敏感程度选择不同的加密强度和算法,确保数据在存储过程中的机密性。
- 支持数据访问权限控制。与医疗应用的用户认证和授权机制相结合,根据用户的角色和权限,对数据的访问进行细粒度的控制。例如,通过访问控制列表(ACL)等方式,规定哪些用户可以对特定的数据进行读取、写入或修改操作。
三、实现步骤
- 使用设备证书验证医疗设备的真实性,阻止非授权设备获取敏感数据
- 设备证书生成与配置:在医疗设备生产或初始化阶段,使用Device Certificate Kit为设备生成证书。首先生成公私钥对,示例代码如下(假设基于Universal Keystore Kit):
import {
huks } from '@kit.UniversalKeystoreKit';
import {
BusinessError } from '@kit.BasicServicesKit';
let deviceId = 'medical_device_001';
let keyAlias = 'device_key';
function GetGenerateProperties() {
let properties: Array<huks.HuksParam> = new Array();
let index = 0;
properties[index++] = {
tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
value: huks.HuksKeyAlg.HUKS_ALG_ECC
};
properties[index++] = {
tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256
};
properties[index++] = {
tag: huks.HuksTag.HUKS_TAG_PURPOSE,
value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_SIGN |
huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_VERIFY
};
properties[index++] = {
tag: huks.HuksTag.HUKS_TAG_DIGEST,
value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256
}
return properties;
}
async function GenerateKey(keyAlias: string) {
let genProperties = GetGenerateProperties();
let options: huks.HuksOptions = {
properties: genProperties
}
await huks.generateKeyItem(keyAlias, options)
.then(() => {
console.info(`promise: generate Key success.`);
}).catch((err: BusinessError) => {
console.error(`promise: generate Key failed, error: ` + err.message);
})
}
GenerateKey(keyAlias);
- 然后向设备证书颁发机构(CA)申请证书,将设备的身份信息(如设备型号、序列号、制造商等)与公钥一起提交给CA,CA验证信息后为设备颁发证书。设备将证书安装到本地安全存储区域(如Universal Keystore Kit),并配置相关的证书使用参数。
- 设备接入验证:当医疗设备尝试接入医疗网络或与其他医疗系统进行通信时,发送设备证书给接收方(如医院信息系统服务器或远程医疗应用服务器)。接收方使用Device Certificate Kit验证证书的有效性和真实性。示例代码如下:
import {
cert } from '@kit.DeviceCertificateKit';
import {
BusinessError } from '@kit.BasicServicesKit';
import {
util } from '@kit.ArkTS';
// 假设这是设备证书数据(实际应用中需从设备获取)
let deviceCertData = '-----BEGIN CERTIFICATE-----\n' +
'MIIBHTCBwwICA+gwCgYIKoZIzj0EAwIwGjEYMBYGA1UEAwwPRXhhbXBsZSBSb\n' +
'290IENBMB4XDTIzMDkwNTAyNDgyMloXDTI2MDUzMTAyNDgyMlowGjEYMBYGA1\n' +
'UEAwwPRXhhbXBsZSBSb290IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\n' +
'HjG74yMIueO7z3T+dyuEIrhxTg2fqgeNB3SGfsIXlsiUfLTatUsU0i/sePnrKglj\n' +
'2H8Abbx9PK0tsW/VgqwDIDAKBggqhkjOPQQDAgNJADBGAiEApVZno/Z7WyDc/mu\n' +
'RN1y57uaYMjrgnvp/AMdE8qmFiDwCIQCrIYdHVO1awaPgcdALZY+uLQi6mEs/oMJ\n' +
'LUcmaag3EQw==\n' +
'-----END CERTIFICATE-----\n';
let textEncoder = new util.TextEncoder();
let encodingBlob: cert.EncodingBlob = {
data: textEncoder.encodeInto(deviceCertData),
encodingFormat: cert.EncodingFormat.FORMAT_PEM
};
let x509Cert: cert.X509Cert = {
} as cert.X509Cert;
try {
x509Cert = await cert.createX509Cert(encodingBlob);
} catch (err) {
let e: BusinessError = err as BusinessError;
console.error(`createX509Cert failed, errCode:${
err.code}, errMsg:${
err.message}`);
}
// 证书链校验数据(假设,实际需根据真实情况配置)
const param: cert.CertChainValidationParameters = {
date: '20231212080000Z',
trustAnchors: [{
CAPubKey: new Uint8Array([0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70,
0x03, 0x21, 0x00, 0xbb, 0x16, 0x9d, 0x8f, 0x5c, 0x30, 0xd0, 0xba, 0x8f, 0x37, 0x6e,
0x33, 0xaf, 0x6f, 0x23, 0x71, 0x23, 0xa5, 0x49, 0x60, 0x1e, 0xd1, 0x07, 0x4b, 0xc9,
0x11, 0x7e, 0x66, 0x01, 0xba, 0x92, 0x52]),
CASubject: new Uint8Array([

最低0.47元/天 解锁文章
1684

被折叠的 条评论
为什么被折叠?



