几天前我接受了一次采访,雇主问我有关安全API服务的安全方式。他说
他想看看客户端是否有安全的方式向服务器端发出API请求而不暴露API密钥。
我谈到了一般的公共/私人密码学,但他想要更简单的方法。
最后,他谈到了使用公共哈希算法(md5,sha1)为客户端安全地哈希其密钥,并且还使用参数和请求对服务器进行哈希处理,但我认为我没有得到这一点。很好。
我记得那里的一些库首先编码要用md5或sha1加密的API请求的主体。但是用单向散列做这件事有什么意义呢?中间人可能不会知道API密钥,但服务器如何知道1.API密钥,2。客户端请求了什么方法?
答案 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")
请注意,这仍然至少会遇到两个问题: