我正在构建其他开发人员应该可以访问的 REST API。为了验证客户端,我决定使用 HMAC-SHA256 请求签名API 密钥和密钥。
所以认证的过程是这样的:
这里的一切都非常清晰和简单。但问题是: 我应该在哪里以及如何存储该密钥,它应该是所有客户端的唯一密钥还是每个客户端都不同。
我已经阅读了大量文章,其中有很多关于如何实现这种请求身份验证的好例子,但没有一篇文章告诉我应该如何存储密钥——在数据库或位于服务器 FS 的某个文档中。据我了解,不应加密API 密钥和秘密密钥。因为第一个仅用于识别或撤销客户端,第二个应该可以快速访问以供服务器创建和比较签名。
回到问题的第二部分,它应该是所有用户的唯一密钥还是每个用户的私有密钥?如果它是唯一的一个键,那么将它隐藏在服务器上很简单,例如在环境变量中。但是,如果它应该在客户端受到损害怎么办?在这种情况下,我应该更改密钥,它会阻止我所有其他客户端的 API...
我在这里找到了一些有关安全性和妥协效果的信息:使用 HMAC-SHA1 进行 API 身份验证 - 如何安全地存储客户端密码? 但仍然没有关于存储的有用信息。
它不可能有鉴定无状态.因此,在使用身份验证设计RESTful软件时,为了安全起见,我们是否会妥协这种架构?这可以走多远?只要能够构建更安全的系统,您能存储任何数量的状态吗?
表示状态转移或REST具有许多核心设计概念.其中最重要的一点是REST必须是无状态的或引用Wikipeida:
"......处于休眠状态的客户端能够与其用户进行交互,但不会产生负载,也不会消耗服务器或网络上的每个客户端存储."
但是,根据定义,用户名和密码是客户端特有的状态,可能会发生变化.此外,客户端可以具有被认证的状态,否则他们将具有有限的访问权限或者没有访问权限.