News API + React:创建一个卓越的实时新闻应用程序
用于符合 HIPAA 要求的 API 分析的安全代理
在 HeathTech 应用程序中,通常会处理私人或与健康相关的数据,这需要遵守法规,例如美国的 HIPAA。这些法规要求以明确定义的方式处理敏感数据,确保只有特定人员可以读取,且所有访问都需记录以供审核。
为符合 HIPAA,必须在公司内部和应用程序中实施技术和管理保障措施。技术保障措施通常会使软件架构变得更加复杂,因此在开始之前,应确保为 HIPAA 合规性所需的额外工程开发工作是必要的。某些情况下,也可能安全地不遵守 HIPAA。
在相关文章中,介绍了如何构建符合 HIPAA 的 API。本文将深入探讨如何使用安全代理来确保健康数据安全以及应用的 HIPAA 合规性。
在没有 HIPAA 的情况下存储健康数据?
如果客户在将数据发送之前对其进行加密,您将无法得知数据的内容,从而实现合理的否认。如果没有加密密钥,您存储和处理的数据对于潜在攻击者而言毫无价值。
这可以通过安全代理来实现。
安全代理是位于客户数据中心的 API 服务器,位于您与客户之间。离开客户数据中心的数据会被加密,然后发送到您自己的数据中心内的 API。
代理使用只有客户知道的密钥进行加密。如果有人窃取了加密数据,而没有客户的加密密钥,他们将无法读取这些数据。
如何构建安全代理
第一步是构建一个服务器,该服务器充当 API,但可以由客户在本地部署。API 的客户端将与该代理进行通信,而不是将请求直接发送到实际的 API。
接下来,需要将所有客户端数据加密到适当的级别,然后再发送到实际的 API。因此,代理需要使用客户提供的加密密钥,而无法访问该密钥。
正确的加密级别取决于 API 的类型:
- 对于简单的键值存储 API,只需将所有内容存储在请求正文中,并在发送之前对整个正文进行加密即可。
- 对于更复杂的 API,代理需要以更复杂的方式处理加密。
最后,当客户想要读取数据时,需要解密数据。因此,代理必须提供一种向客户显示明文数据的方法。
安全代理示例
创建了一个 GitHub 存储库来演示安全代理的实现,包含三部分:分析 API 服务器、代理 API 服务器和客户端。
免责声明:这是一个基本示例,使用的加密库未经过审查。构建系统时,需独立研究这一部分。
分析 API
分析 API 的基本部分使用 Node.js 和 Express 框架构建,包含两个端点:一个接收事件并存储在数组中,另一个计算每个事件的频率并将总和返回客户端。
const eventStore = [];
api.post("/event", ({ body }, response) => {
eventStore.push(body.event);
response.status(201).json("201 - Created");
});
api.get("/results", (request, response) => {
const results = eventStore.reduce(
(results, event) => {
if (!results[event]) results[event] = 0;
results[event]++;
return results;
},
{}
);
response.status(200).json({ results });
});
api.listen(9000);
分析 API 客户端
客户端将带有事件字符串的 JSON 对象发送到分析 API,监听端口 9000,并获取结果。
async function logEvent(event) {
return axios.post("http://localhost:9000/event", { event });
}
async function getResults() {
const response = await axios.get("http://localhost:9000/results");
return response.data.results;
}
await logEvent("plaintext-event-a");
await logEvent("plaintext-event-a");
await logEvent("plaintext-event-a");
await logEvent("plaintext-event-b");
await logEvent("plaintext-event-b");
const results = await getResults();
运行示例
在添加日志记录的情况下运行此示例,输出如下:
[Client ] Sending event: plaintext-event-a
[Analytics] Received: plaintext-event-a
[Client ] Sending event: plaintext-event-a
[Analytics] Received: plaintext-event-a
[Client ] Sending event: plaintext-event-a
[Analytics] Received: plaintext-event-a
[Client ] Sending event: plaintext-event-b
[Analytics] Received: plaintext-event-b
[Client ] Sending event: plaintext-event-b
[Analytics] Received: plaintext-event-b
[Analytics] Sending results: {
'plaintext-event-a': 3,
'plaintext-event-b': 2
}
[Client ] Results: {
'plaintext-event-a': 3,
'plaintext-event-b': 2
}
客户端将事件发送到分析 API,后者将事件保存在其存储中,最终客户端获取每个事件的总和。
安全代理 API
安全代理的设计与分析 API 类似,但必须在客户的数据中心本地运行。虽然提供商不必符合 HIPAA,但客户若处理健康相关数据,则需符合规定。
api.post("/event", async ({ body }, response) => {
const event = cryptoStore.encrypt(body.event);
const res = await axios.post("http://localhost:9000/event", { event });
response.status(res.status).end(res.data);
});
api.get("/results", async (request, response) => {
const { data: { results }, status } = await axios.get("http://localhost:9000/results");
const decryptedResults = Object.keys(results).reduce((acc, encryptedEvent) => {
const event = cryptoStore.decrypt(encryptedEvent);
acc[event] = results[encryptedEvent];
return acc;
}, {});
response.status(status).json({ results: decryptedResults });
});
api.listen(9999);
运行示例
运行添加了日志记录并在客户端与分析 API 之间设置代理的示例,输出如下:
[Client ] Sending event: secret-event-a
[Proxy ] Received event: secret-event-a
[Analytics] Received event: 23c06d46723cd...
[Client ] Sending event: secret-event-a
[Proxy ] Received event: secret-event-a
[Analytics] Received event: 23c06d46723cd...
[Client ] Sending event: secret-event-b
[Proxy ] Received event: secret-event-b
[Analytics] Received event: 604c04290177e...
[Analytics] Sending results: {
'23c06d46723cd...': 3,
'604c04290177e...': 2
}
[Client ] Results: {
'secret-event-a': 3,
'secret-event-b': 2
}
安全代理充当中间人,接收客户端事件,同时将事件名称加密后发送至分析 API。分析 API 并不知情,无法判断事件名称是否涉及健康数据。
结论
如果 API 不需识别其使用的数据类型,安全代理是规避 HIPAA 合规性的便捷解决方案。
客户携带自己的加密密钥,并在自己的数据中心部署安全代理。HIPAA 相关要求不再是关注的重点,因为可以合理推诿;所有数据在离开客户网络之前已被加密,从而确保未访问过加密密钥。