所有文章 > API安全 > 用于符合 HIPAA 要求的 API 分析的安全代理
用于符合 HIPAA 要求的 API 分析的安全代理

用于符合 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 相关要求不再是关注的重点,因为可以合理推诿;所有数据在离开客户网络之前已被加密,从而确保未访问过加密密钥。

原文链接:Secure Proxy for HIPAA-Compliant API Analytics

#你可能也喜欢这些API文章!