API签名认证如何像Mashery一样实施?

时间:2011-11-07 21:33:47

标签: algorithm api authentication md5 mashery

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

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

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

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

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

4 个答案:

答案 0 :(得分:3)

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

对我来说似乎很实用。 600 MD5s并没有做很多处理。事实上,现代密码验证器(就像使用bcrypt的东西)会执行更多的工作来验证密码。

答案 1 :(得分:2)

亚马逊给出了一个很好的请求签名示例,其中有很多细节应该让机制显而易见(我意识到它不是奇迹 - 但我认为这是你的追求,或者至少会帮助你实现API安全幸福之旅)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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");

?>