Algorithm 什么是一种安全的方式来提供API服务,而不会产生大量的通信开销?

Algorithm 什么是一种安全的方式来提供API服务,而不会产生大量的通信开销?,algorithm,security,hash,Algorithm,Security,Hash,几天前,我参加了一次面试,雇主问我如何安全地提供API服务。他说 每个API请求都需要API密钥 每个API请求将请求一个方法,该方法使用一个参数,每个服务都将通过这个方法工作 他想知道是否有一种安全的方法可以让客户端到服务器端的API请求不暴露API密钥 我谈到了一般的公共/私有加密,但他想要比这更简单的方法 最后,他谈到了使用通用散列算法(md5,sha1)为客户端安全地散列其密钥,以及散列带有参数的方法和对服务器的请求,但我认为我没有很好地理解这一点 我记得有些库首先对要用md5或sha1

几天前,我参加了一次面试,雇主问我如何安全地提供API服务。他说

  • 每个API请求都需要API密钥
  • 每个API请求将请求一个方法,该方法使用一个参数,每个服务都将通过这个方法工作
  • 他想知道是否有一种安全的方法可以让客户端到服务器端的API请求不暴露API密钥

    我谈到了一般的公共/私有加密,但他想要比这更简单的方法

    最后,他谈到了使用通用散列算法(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")
    

    请注意,这仍然存在至少两个问题:

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

  • 如果他也不明白这一点,我也不会感到惊讶。
    stipKeyFromRequest
    是如何工作的?这基本上就是从
    sha1(request+APIKey)
    中找出
    key
    参数,然后删除文本,直到你点击另一个
    &
    或字符串的结尾。这与
    提取键
    有什么区别?
    提取键
    返回请求的键部分(即十六进制字符串)
    stripKey
    返回除密钥以外的所有内容。应该与添加密钥之前的请求相同。谢谢!,但在这种情况下,服务器不太了解必须使用哪个API密钥来与请求进行比较,对吗?若每个用户都有自己的API密钥,服务器就不会知道。。我想连雇主都不明白这个问题的概念。