用于休息 API 的 HMAC 解决方案

信息安全 中间人 休息 hmac
2021-08-23 13:11:50

我正在尝试学习一些有关 REST api 的知识,而我遇到的问题之一是安全性。

我正在将 angularjs 用于 Web 界面和用于 php api 的苗条框架。我已经阅读了一些文章(我喜欢这篇文章)并开始按照本教程实现 HMAC (不完全相同的步骤)。我想知道我的方法中是否存在一些重大的安全漏洞,或者我的做法是否正确。

当我使用 AngularJS 时,我知道我存储在客户端的所有内容都不安全。我假设用户有一台“干净如新”的机器并且知道他在做什么(我可能是主要的 api 用户)。我更关心的是中间人和复制。

(在客户端)

  1. 用户输入他的用户名和密码。
  2. 他的密码被加密(例如,sha256)并存储为全局;(他的用户名只是存储在某个地方)
  3. 在 web 接口发送到 api 的每个请求中,都会在标头中发送一个 hmac 哈希,其中消息是使用用户名、时间戳、资源路径、随机字符串(服务器和客户端都知道的)形成的; 硬编码),关键是密码哈希。

(在服务器端)

当服务器收到请求时:

  1. 检查时间戳;
  2. 检查用户名是否存在于数据库中;
  3. 尝试使用变量(也在请求中收到)用户名、时间戳、资源路径和随机字符串(在请求中未收到此字符串;它只是硬编码)来复制相同的 hmac 哈希。对于密钥,他使用存储在数据库中的值,即给定用户的加密密码。

如果所有验证都顺利,用户应该是一个值得信任的人,而不仅仅是一个中间人。

1个回答

我看到您的方法存在各种问题(没有特别的顺序,很可能不是完整的列表):

  • 看起来您正在部署没有 SSL/TLS 的应用程序。如果是这种情况,您不能依赖客户端,因为 MITM 可以用他/她选择的任何东西替换您的(安全)客户端实现。

    没有 SSL 就无法创建安全的 Web 应用程序,因为客户端会通过不安全的通道加载您的应用程序。如果您的应用程序是通过安全通道部署的(不确定是否angularjs支持离线部署),请忽略它。

    如果您使用 SSL,这可能会减轻所有其他攻击场景,因为它可以防止 MITM 和重放攻击。唯一可能成为问题的是身份验证,因为您不使用客户端证书。但是通常会话令牌对于 Web 应用程序来说就足够了,因为服务器已经过正确的身份验证(假设您使用了正确的实现)。

  • 您希望防止重放攻击,但仅对请求使用时间戳。如果攻击者能够足够快地记录和回复请求,服务器将认为该请求有效。根据您的实际数据,这可能是也可能不是问题。

    为了防止这种攻击,请添加一个请求计数器或将最后一个请求的时间戳存储在服务器上(并且需要比存储的时间戳更大的时间戳)。

  • 除了您的实际 HMAC 之外,您并没有对您的密码进行加盐,这样具有数据库访问权限的攻击者对您的应用程序和您的用户密码来说是致命的。我强烈建议您添加密码。

    此外,通常的做法是多次散列密码以增加针对散列的字典攻击所需的工作量。

  • 从你写的内容来看,你并不清楚你是否将消息/请求内容包含到你的 HMAC 中。但我假设您知道 HMAC 仅验证生成它的数据的完整性这一事实。

  • 您不会对 HMAC 使用真正的随机密钥。鉴于当今的计算能力,弱密码很可能会导致可破解的 HMAC,因为可能的哈希值很容易计算。散列多轮可能会有所帮助(如果攻击针对多个用户,则加盐),但最后安装一些暴力预防至关重要(每小时的最大非法请求数或类似数量,然后阻止源 IP)。

    但是,我个人永远不会仅根据用户密码信任任何东西。

因此,就个人而言,我建议不要使用自己的加密货币并坚持使用 SSL/TLS。虽然这基本上意味着每个受客户信任的 CA 都可以认证 MITM,但我认为这种风险远低于 MITM 通过向用户提供恶意 web 应用程序、重放请求或破解 HMAC 的秘密来证明自己的风险。