我正在使用 C# 实现一个 REST Web 服务,它将作为云服务托管在 Azure 上。由于它是 REST 服务,因此它是无状态的,因此没有 cookie 或会话状态。
Web 服务只能通过 HTTPS 访问(证书由 StartSSL.com 提供)。
用户成功登录服务后,他们将获得一个安全令牌。此令牌将在未来的通信中提供身份验证。
令牌将包含客户端的时间戳、用户 ID 和 IP 地址。
所有通信都只会通过 HTTPS 进行,所以我不担心令牌被拦截并用于重放攻击;无论如何,令牌都会过期。
由于这是一项面向公众的服务,但我担心有人可以注册该服务,登录然后修改他们收到的令牌以访问其他用户的帐户。
我想知道如何最好地保护令牌的内容并验证它没有被篡改。
我计划执行以下操作来保护令牌:
客户端成功登录服务,服务执行以下操作:
- 生成一个随机值并使用 SHA256 对其进行 1000 次散列。
- 从私钥 + 散列随机值生成一次性会话密钥。
- 使用 SHA256 将会话密钥散列 1000 次,然后使用它来加密令牌
- 使用私钥使用 RSA 对加密令牌进行签名。
- 在未加密的 JSON 包中将加密的令牌 + 签名 + 散列的随机值发送给客户端。
当客户端调用服务时,它会将未加密的 JSON 包中的加密令牌和签名发送到服务。该服务将
- 从私钥 + 散列随机值重新创建会话密钥
- 使用私钥验证签名
- 使用散列会话密钥解密令牌
- 检查令牌是否未过期
- 继续请求的操作...
我对加密一无所知,所以我有一些问题:
- 这是足够的还是矫枉过正?
- 我读到要检测篡改,我应该在令牌中包含一个 HMAC。由于我使用私钥签名,我还需要 HMAC 吗?
- 我应该使用 Rijndael 而不是 RSA 吗?
- 如果首选 Rijndael,是否需要生成的 IV 才能解密?即我可以把它扔掉还是需要将加密令牌发送给它?例如加密令牌 + HMAC + IV + 散列随机值。
由于所有通信都通过 HTTPS 进行,因此未加密的 JSON 包在到达客户端之前并不是真正未加密的。
此外,我可能想稍后在 PHP 中重新实现该服务,因此这一切都需要在 PHP 中实现。
谢谢你的帮助