我的 REST 服务目前使用 SCRAM 身份验证来为调用者和用户颁发令牌。
SCRAM 交易所发行的代币有一个到期时间,之后需要重复登录。我们还将发行没有过期的“无限”令牌,以简化个人(将我们的服务用于个人用途)的集成并为 JSONP 端点做准备。
我们有能力撤销调用者权限(令牌附加到的帐户)和禁止 IP,以及在任何时间段内对任何类型的请求施加配额。
然而,我还没有实现的一件事是请求的 MAC。正如我更多地考虑的那样,对于某些请求,我认为这是必要的,因为否则令牌可能会被盗,并且在我们识别它并停用相关的呼叫者帐户之前,可能会对我们的用户帐户造成一些损害。
在许多系统中,MAC 是从请求的正文或查询字符串生成的,但是这很难实现,因为我使用的是 ASP.Net Web API 并且不想读取正文两次。同样重要的是,我希望让呼叫者能够轻松访问服务,并且我需要能够同时支持桌面/移动应用程序以及 Web 浏览器。
所以我在想的是在注册时将MAC密钥发送给用户,并让他们计算请求MAC:
- url,可能减去查询字符串
- 动词
- 请求 ip(虽然可能是某些移动设备上的障碍,但肯定是在 javascript 中)
- UTC 客户端发出请求的日期和时间。
对于最后一个,我当然会让客户端在请求标头中发送该字符串 - 我可以使用它来确定请求是否足够“新鲜”。
我的想法是,虽然这并不能防止消息正文被篡改,但它确实可以防止恶意第三方使用模型请求作为模板来处理不同的请求。我相信只有在中间攻击中最具侵略性的人才能颠覆这一点,而且我认为我们的服务无法提供任何有价值的信息或能力来保证这一点。
这些服务也将使用 SSL 来处理敏感内容。如果我这样做,那么我将使用 HMAC-SHA-256 和使用 PRNG 生成的密钥。
这听起来够吗?我错过了什么吗?
在安全方面,我不认为我是初学者,但在处理它时,我总是如此。我被笼罩在疑问之中,所以我很高兴有这个社区可以呼吁!