几天前我进行了一次面试,雇主问我如何安全地提供API服务。他说
他想知道客户端是否有一种安全的方式,可以在不公开API密钥的情况下向服务器端提供API请求。
我谈到了一般的公共/私人密码学,但他想要比这更简单的方法。
最后,他谈到了客户端使用通用哈希算法(md5,sha1)安全散列其密钥,并使用参数和对服务器的请求对方法进行散列,但我认为我没有很好地理解这一点。
我记得有一些库首先编码了要用md5或sha1加密的API请求的主体。但是用单向散列做这件事有什么意义呢?中间的人可能不知道API密钥,但是服务器如何知道1.API密钥,2.客户机请求了什么方法?
发布于 2012-02-21 19:58:11
您可以将请求与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")请注意,这至少仍然存在两个问题:
https://stackoverflow.com/questions/9384133
复制相似问题