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

在使用大多数API时,为什么它们需要两种类型的身份验证,即密钥和秘密?,api,authentication,key,Api,Authentication,Key,我一直在使用API,我一直想知道为什么必须使用密钥和秘密 为什么需要两种类型的身份验证?当服务器接收到API调用时,它需要知道两件事:谁在进行调用,以及调用是否合法 如果您只有一个项目(“键”),并且在每次通话中都包含它,那么它将回答这两个问题。基于“密钥”,服务器知道你是谁,因为只有你知道密钥,它证明呼叫实际上来自你。但在每次通话中都包含密钥是一种糟糕的安全做法:如果有人在传输过程中甚至能读到你的一条消息,你的密钥就会被泄露,有人可以假装是你。因此,除非您使用HTTPS,否则这种方法不起作用

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


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

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

如果您只有一个项目(“键”),并且在每次通话中都包含它,那么它将回答这两个问题。基于“密钥”,服务器知道你是谁,因为只有你知道密钥,它证明呼叫实际上来自你。但在每次通话中都包含密钥是一种糟糕的安全做法:如果有人在传输过程中甚至能读到你的一条消息,你的密钥就会被泄露,有人可以假装是你。因此,除非您使用HTTPS,否则这种方法不起作用

相反,你可以在每次通话中加入一个数字签名,用一些“秘密”号码签名。(不会发送“机密”号码本身)。如果攻击者设法读取您的邮件,他们将无法从签名中找出此“机密”号码。(这就是数字签名的工作原理:它们是单向的)

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

因此,我们要做的是:发送一个“密钥”(标识用户)和一个使用“机密”号码创建的签名(证明消息是合法的)。服务器根据密钥查找用户,然后使用该用户的“机密”号验证签名


这有点像你写支票的时候:上面有一个账号(用来识别你)和你的签名(用来证明你就是你)。只有账号并不能证明你真的开了支票。只有签名而没有账号会迫使银行将您的支票与其所有账户的所有签名进行比较,这显然是低效的。

这很有解释性,但对于使用某个秘密号码签名的含义,仍然有点困惑??请参见或,对于一个真实的示例。本质上,一种可能是计算API“机密”和API请求本身(或其中最关键的部分)组合的哈希函数——这就是“签名”。它仍然不能解释当所有通信都是HTTPS时为什么需要另一个密钥。奇怪的是有些API,如Sentry()把两把钥匙都传过去。