在消息级别保护 REST api

信息安全 验证 移动的 休息
2021-08-27 23:14:45

我想要一些关于以下身份验证想法的反馈,它是否有意义,是否有这样做的标准方法(或类似方法),所以我可以依赖经过良好测试的实现。

我在这里看到了很多关于如何保护与服务器的通信的答案,大多数答案都是简单地正确使用 TLS。我正在寻找一种允许对消息本身进行加密和签名的解决方案,以便消息在通过后端时保持安全,直到它们到达目标服务。

语境

  • 使用 phonegap 构建的适用于 android 2.3+ 和 iOS 6+ 的移动应用程序(因此使用的库应该可以从 Java/obj-c 或 js 中使用)
  • 该应用程序使用 REST json api 与服务器通信
  • 消息内容在通过后端时应保持机密(代理/负载均衡器没有终止)
  • 应该支持“记住我”,所以用户不必一直重新输入他们的密码
  • 所有通信都通过 ssl/tls 完成

验证

  • 客户端收集用户凭据(用户名、密码和一些额外的安全信息)
  • 客户端生成对称密钥
  • 客户端使用对称密钥加密凭证
  • 客户端使用服务器公钥加密对称密钥(客户端随附)
  • 客户端通过 https 发送加密消息、密钥和随机数(验证服务器证书)
  • 服务器代理将认证请求转发给认证服务
  • 身份验证服务解密对称密钥和消息
  • 如果凭据有效,则服务会生成身份验证令牌
  • 令牌与服务器上的对称密钥相关联,如果凭据无效,则在回复请求后丢弃该密钥
  • 令牌返回给用户,使用对称密钥加密
  • 令牌和密钥存储在客户端本地,由短密码加密

我假设如果使用 tls,这些请求不会受到重放攻击,因此攻击者不存在重放消息以获取新令牌的风险。

其他 API 调用

  • 客户端生成请求消息,对其进行加密并签署加密消息
  • 客户端将加密的消息、随机数和签名及其身份验证令牌发送到服务器
  • 在接收时,服务器查找与接收到的令牌关联的密钥,验证签名并在处理之前解密消息

问题

  • 重复使用相同的对称密钥有什么问题吗?
  • 什么是对称密钥的好选择?
    • AES-OCB 或 AES-CBC + HMAC 签名呢?
  • 应该多久更改一次对称密钥?
  • 更新密钥/刷新令牌的最佳方式是什么?我正在考虑在身份验证响应期间发出刷新令牌并让密钥在特定时间段后过期,因此如果用户不刷新他们的密钥,他们必须再次登录。

谢谢

2个回答

除非我遗漏了某些东西,否则您的解决方案看起来非常像安全令牌服务。对于 STS,关键是要有一个受信任的一方来向依赖方识别发起方。在您的情况下,信任经纪人和依赖方似乎是同一实体。

如果您的目标是将信任传播到最终目的地,只需通过代理使用 SSL,并使用客户端证书来识别端点。假设您希望 HTTP 通过您的代理以便检查流量,请实施标准 STS。

正如 Xander 所说,REST 非常适合轻量级服务调用,但是当您想要实现安全性时,您应该使用 SOAP,特别是 WS-Security 扩展。这真的没那么难,特别是如果你像你一样控制两端。有关如何在 Android 上的 Java 中执行此操作,请参阅此堆栈溢出问题。

如果您确实继续使用您的自制解决方案,值得注意的是,您的身份验证中的最后三个项目符号看起来是您的弱点。

我不能说我已经详细回顾了它们,但您可能会对在 HTTP 级别实现消息级安全性的现有尝试感兴趣。例如:

这两个项目似乎都不活跃。他们也可能缺乏其他安全协议通常拥有或应该拥有的专家审查。这并不是说他们有什么问题。我怀疑 HTTPsec 缺乏成功是因为它在“SOAP 与 REST 之战”期间到来(在 REST 方面增加了一点复杂性)以及它只有一个实现(在 Java 中)与非免费许可证。

调查是否对使用 OpenPGP 等现有工具加密和签署消息实体感兴趣。

REST 是一个对不同的人有不同含义的词。有时,它仅仅意味着 HTTP 上的有效负载,没有多层 SOAP。此类服务是否真正遵循HATEOS 原则是另一回事。

我个人对此的看法是,REST 的无状态性应该应用于应用程序的核心功能,而不一定应用于其安全方面。当然,如果在接收方一方不保持某种状态,就很难(如果不是不可能的话)防止重放攻击。

话虽如此,我不确定您是否对纯消息级安全感兴趣。相反,您似乎主要对通过 HTTP 建立相当于 SSL/TLS 的隧道感兴趣,因为您无法运行从客户端到后端的直接 TCP 连接。由于您还使用 SSL/TLS,这表明这一切的主要原因是您不信任负载均衡器。尝试编写自己的协议通常很困难,而且通常是个坏主意。关于加密和 MAC 算法的建议取决于细节。(相比之下,TLS 的一些问题需要一段时间才能被识别和解决,尽管它是一个具有详细规范的开放协议,由许多专家研究过。)