Algorithm 什么是一种安全的方式来提供API服务,而不会产生大量的通信开销?
几天前,我参加了一次面试,雇主问我如何安全地提供API服务。他说Algorithm 什么是一种安全的方式来提供API服务,而不会产生大量的通信开销?,algorithm,security,hash,Algorithm,Security,Hash,几天前,我参加了一次面试,雇主问我如何安全地提供API服务。他说 每个API请求都需要API密钥 每个API请求将请求一个方法,该方法使用一个参数,每个服务都将通过这个方法工作 他想知道是否有一种安全的方法可以让客户端到服务器端的API请求不暴露API密钥 我谈到了一般的公共/私有加密,但他想要比这更简单的方法 最后,他谈到了使用通用散列算法(md5,sha1)为客户端安全地散列其密钥,以及散列带有参数的方法和对服务器的请求,但我认为我没有很好地理解这一点 我记得有些库首先对要用md5或sha1
我记得有些库首先对要用md5或sha1加密的API请求体进行编码。但是使用单向散列的意义是什么呢?中间人可能不知道API密钥,但服务器如何知道1.API密钥,2.客户端请求了什么方法?您可以将请求与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")
请注意,这仍然存在至少两个问题:
如果他也不明白这一点,我也不会感到惊讶。
stipKeyFromRequest
是如何工作的?这基本上就是从sha1(request+APIKey)
中找出key
参数,然后删除文本,直到你点击另一个&
或字符串的结尾。这与提取键
有什么区别?提取键
返回请求的键部分(即十六进制字符串)stripKey
返回除密钥以外的所有内容。应该与添加密钥之前的请求相同。谢谢!,但在这种情况下,服务器不太了解必须使用哪个API密钥来与请求进行比较,对吗?若每个用户都有自己的API密钥,服务器就不会知道。。我想连雇主都不明白这个问题的概念。