AWS或阿里云为何使用密钥对而不是单一字符串作为 Token

谢邀。因为我没有详细去了解过,所以答案可能不够完整和严谨,仅供参考。如你所说,Access-Key 是用来标识用户身份的,而用户没有把握保证不泄露它(比如邮箱被盗了)。所以服务提供商不能只看 Access-Key,还需要确认 Access-Secret-Key。同样,用户也无法保证 Access-Secret-Key 不泄露,所以服务提供商需要将这个值设计成不出现在 HTTP/HTTPS 请求里(即只用于签名);而在泄露之后,还需要提供重置功能,避免损失的扩大。如果是 AWS 这类私有使用(即每个用户自己去调用 API),上述的安全机制也够用了,毕竟泄露也就影响一个用户;而如果是微博客户端这类公开使用(即大部分用户使用同一个客户端),对请求签名也就意味着密钥会存在于客户端中,就肯定能反编译找到,而且如果重置的话,这些用户都会受影响。所以 OAuth 2.0 为了顺应移动互联网时代,相对于 OAuth 1.0/1.0a 做出了不再要求客户端签名,但强制要求使用 HTTPS 的改进。但是仅靠 HTTPS 是不够支撑 OAuth 2.0 的安全性的,历史上它出现过很多次问题,大部分都是因为实现者没有按照规范去处理,忽略或省略了其中的几步。
■网友
原来做过一些OAuth的client,但是好几年没接触了,随便答下,请折叠。如果是从第三方客户端直接到AWS的话,用Key和Secret跟只用Key,安全性是几乎一样的,因为这个Secret也一定保存在客户端本地了。所以正常应该是第三方客户端把请求参数发给第三方自己的服务端,由服务端验证过用户身份后再用服务端持有的secret计算最终的签名,至于最终的请求是服务端发起还是客户端发起,由产品特性、用户数量情况决定。


    推荐阅读