【问题标题】:How does API signature authentication work as implemented by Mashery?Mashery 实现的 API 签名身份验证如何工作?
【发布时间】:2011-12-23 23:33:54
【问题描述】:

Mashery 允许通过如下数字签名进行身份验证:

  • 首先,连接以下组件:
    • API 密钥
    • 共享密钥
    • UNIX 时间戳
  • 然后,创建连接字符串的 MD5 哈希。

文档指出,unix 时间戳只需要 +/- 5 分钟的精度。详情:http://support.mashery.com/docs/read/mashery_api/20/Authentication.

假设这不是商业机密,执行此类身份验证的算法是什么?

具体来说,当 unix 时间戳可以变化 5 分钟时,这怎么可能? “蛮力”技术可能是为每个可能的时间戳值计算签名,直到找到匹配(或不匹配),但这对于验证频繁的 API 调用似乎并不实用。

【问题讨论】:

    标签: algorithm api authentication md5 mashery


    【解决方案1】:

    是的,这似乎就是它的作用。您提供的文档链接指出,“Mashery 服务器上当前时间戳的任一侧都允许有五分钟的摆动,以允许合理的时钟漂移。”这意味着他们需要检查多达 600 个哈希来查看提交的哈希是否有效。 5 分钟是 300 秒。加号或减号使其成为 600 次检查。

    这对我来说似乎很实用。 600 MD5s 不是很多处理。事实上,现代密码验证器(例如使用 bcrypt 的工具)会执行更多工作来验证密码。

    【讨论】:

    • 我想你是对的。在我看来,我错误地以毫秒为单位,而不是秒。一个聪明的实现也可能从偏移量零开始,然后上下波动直到找到一个匹配项(因此很少需要完整的 600 次检查。)假设没有其他人提供一种有效的“部分”技术,那么赏金将被授予" 当给定用于生成哈希的三个分量中的两个分量时,MD5 哈希匹配。 (......这是不可能的。)
    • 谢谢。此外,通过以分钟而不是秒为单位测量时间,Mashery 可以将所需的工作量减少 60 倍。他们选择了更常见的自纪元以来的秒数测量,而不是自纪元以来的分钟数。
    • 此外,他们本可以说:将自时代以来的秒数除以 600。然后他们只需要执行一次哈希。
    • 感谢@Fantius,您的最后一条评论帮了我很多忙!这就是我最终使用的方法,如果您不需要极高的安全性,除以 600 效果很好。
    【解决方案2】:

    Amazon 给出了请求签名的一个很好的例子,并且在相当多的细节中应该使机制显而易见(我意识到它不是混搭 - 但我认为这是你所追求的,或者至少会帮助你获得 API 安全幸福的旅程)

    http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?RESTAuthentication.html

    【讨论】:

    • 这是非常有趣的信息。谢谢。但是,仔细查看细节,我认为这并不能回答我的问题。具体来说,AWS 似乎也希望通过 HTTP 标头未散列地提供时间戳。所以很明显,他们可以在不处理系统时间差异的情况下计算出准确的签名哈希。在 Mashery 的情况下,日期不会在散列之外传递。
    • AWS 方法对服务器来说似乎更容易(需要更少的计算),并且不会使客户端工作更加困难,也不会以任何实际方式降低安全性(除非你有一些奇怪的利基安全性考虑)。当然,您可以更改查询字符串中的可见时间戳,但签名将不匹配。
    • 我完全同意。乍一看,AWS 方法对我来说似乎也更好。出于好奇,我问了最初的问题,看看是否有一些我对 MD5 哈希数字签名不了解的地方。我不打算复制 Mashery 方法。
    【解决方案3】:

    Mashery 还可以根据需要预先生成有效签名列表或缓存每个签名。签名对于 Mashery 为该 API 密钥/共享密钥保护的所有 API 都是全局的,因此无需为每个请求唯一地验证 API 调用。

    【讨论】:

      【解决方案4】:

      sha256 相当快。即使在 php 中,你也可以每秒计算 830K sha256,所以他们很可能只是暴力破解。

      <?php
      
      $COUNT = 6000000;
      $start = microtime(true);
      for($i = 0; $i < $COUNT; $i++) {
        $out = hash('sha256', 'wefjklwfekjlewfjklwefjklfwejkwefjklwfekjl' . $i);
        //print("$out\n");
      }
      $total = microtime(true) - $start;
      print("Time: $total\n");
      print("sha256's per second: " . ($COUNT / $total) . "\n");
      
      ?>
      

      【讨论】:

        猜你喜欢
        • 2012-07-15
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-10
        • 2022-06-28
        • 2013-06-02
        相关资源
        最近更新 更多