什么是服务API服务的安全方式,不会产生大量的通信开销?

时间:2012-02-21 19:48:54

标签: algorithm security hash

几天前我接受了一次采访,雇主问我有关安全API服务的安全方式。他说

  1. 每个API请求都需要API密钥。
  2. 每个API请求都会请求1个单一方法,该方法只需一个参数,每个服务都可以使用这个方法。
  3. 他想看看客户端是否有安全的方式向服务器端发出API请求而不暴露API密钥。

    我谈到了一般的公共/私人密码学,但他想要更简单的方法。

    最后,他谈到了使用公共哈希算法(md5,sha1)为客户端安全地哈希其密钥,并且还使用参数和请求对服务器进行哈希处理,但我认为我没有得到这一点。很好。

    我记得那里的一些库首先编码要用md5或sha1加密的API请求的主体。但是用单向散列做这件事有什么意义呢?中间人可能不会知道API密钥,但服务器如何知道1.API密钥,2。客户端请求了什么方法?

1 个答案:

答案 0 :(得分:0)

您可以将请求与API密钥一起散列。然后将哈希添加到请求中。

这样哈希就永远不会过去了。服务器可以从他自己的API密钥副本进行验证。


例如,客户端执行:

var request = "http://example.com/bla?a=1&b=2";
var hash = sha1(request + ApiKey).ToHex();
var request-with-hash = request +"&key="+hash;

服务器确实:

var receivedRequest = "http://example.com/bla?a=1&b=2&key=ABC...09"
var key=extractKey(receivedRequest); // ABC...09
var strippedRequest = stripKeyFromRequest(receivedRequest);
var hash = sha1(strippedRequest + ApiKey).ToHex();
if(hash!=key)
  Error("ApiKeyWrong")

请注意,这仍然至少会遇到两个问题:

  1. 重播攻击。这可以通过使用更好的协议来避免,使用某种nonce。
  2. API密钥可以简单地从客户端提取,除非它在安全系统上运行。这是一个根本问题,是无法避免的。不受信任的系统上的ApiKeys不安全。
相关问题