使用大多数API时,为什么它们需要两种类型的身份验证,即密钥和密钥?

mag*_*ger 27 authentication api key

我一直在使用API​​,我一直想知道为什么你必须使用密钥和秘密?

为什么需要两种类型的身份验证?

Eug*_*sky 59

当服务器收到API调用时,它需要知道两件事:谁在进行呼叫,以及呼叫是否合法.

如果您只有一个项目("密钥"),并且每次调用都包含它,它将回答这两个问题.基于"密钥",服务器知道您是谁,并且因为只有您知道密钥才能证明呼叫实际上来自您.但是,在每次通话时都包含密钥是不好的安全措施:如果有人甚至可以在传输过程中阅读您的一条消息,那么您的密钥就会受到损害,而且有人可能会伪装成您.因此,除非您使用HTTPS,否则此方法不起作用.

相反,您可以在每个呼叫中​​包含一个数字签名,并使用一些"秘密"号码进行签名.("秘密"号码本身不发送).如果攻击者设法阅读您的消息,他们将无法从签名中找出这个"秘密"号码.(这就是数字签名的工作方式:它们是单向的).

但这并不能解决识别问题:在后一种情况下,服务器如何知道谁在拨打电话?它可以尝试根据每个用户的"秘密"验证签名,但当然这将非常耗时.

所以,这就是我们所做的:发送"密钥"(标识用户)和使用"秘密"号创建的签名(证明消息是合法的).服务器根据密钥查找用户,然后使用该用户的"秘密"号码验证签名.

这有点像你写支票时:它上面有一个帐号(以识别你)和你的签名(以证明你是你).仅拥有帐号并不能证明您确实写了支票.只有没有帐号的签名将迫使银行将您的支票与其所有帐户的所有签名进行比较,这显然效率低下.

  • 它很有说服力,但仍然有点混乱,你用什么秘密号码签名是什么意思? (5认同)
  • 有关实际示例,请参阅http://en.wikipedia.org/wiki/Digital_signature,或http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html.本质上,一种可能性是计算API"秘密"和API请求本身(或其最关键部分)组合的一些散列函数 - 这就是"签名". (2认同)
  • 当所有通信都在HTTPS中时,它仍然无法解释为什么需要另一个密钥. (2认同)