我一直在使用API,我一直想知道为什么你必须使用密钥和秘密?
为什么需要两种类型的身份验证?
答案 0 :(得分:56)
当服务器收到API调用时,它需要知道两件事:谁在进行呼叫,以及呼叫是否合法。
如果您只有一个项目(“密钥”),并且每次通话都包含它,它将回答这两个问题。基于“密钥”,服务器知道您是谁,并且因为只有您知道密钥才能证明呼叫实际上来自您。但是,在每次通话时都包含密钥是不好的安全措施:如果有人甚至可以在传输过程中阅读您的一条消息,那么您的密钥就会受到损害,而且有人可能会伪装成您。因此,除非您使用HTTPS,否则此方法不起作用。
相反,您可以在每个呼叫中包含一个数字签名,并使用一些“秘密”号码签名。 (“秘密”号码本身不发送)。如果攻击者设法阅读您的消息,他们将无法从签名中找出这个“秘密”号码。 (这就是数字签名的工作方式:它们是单向的)。
但这并不能解决识别问题:在后一种情况下,服务器如何知道谁在拨打电话?它可以尝试根据每个用户的“秘密”来验证签名,但当然这将非常耗时。
所以,这就是我们所做的:发送“密钥”(标识用户)和使用“秘密”号创建的签名(证明消息是合法的)。服务器根据密钥查找用户,然后使用该用户的“秘密”号码验证签名。
这有点像你写支票时:它上面有一个帐号(以识别你)和你的签名(以证明你是你)。仅拥有帐号并不能证明您确实写了支票。只有没有帐号的签名将迫使银行将您的支票与其所有帐户的所有签名进行比较,这显然效率低下。