我正在使用C#实现一个REST Web服务,该服务将作为云服务托管在Azure上。由于它是REST服务,因此没有Cookie或会话状态。
Web服务只能通过HTTPS访问(由StartSSL.com提供的证书)。
用户成功登录到服务后,将获得安全令牌。该令牌将在未来通信中提供身份验证。
该令牌将包含客户端的时间戳、用户ID和IP地址。
所有通信都仅在HTTPS上发生,所以我不担心令牌被截获并用于重播攻击;令牌将具有过期时间。
由于这是一个面向公众的服务,我很担心有人注册服务,登录后修改接收到的令牌以访问其他用户帐户。
我想知道如何最好地保护令牌内容,并验证它是否已被篡改。
我计划执行以下步骤来保护令牌:
客户端成功登录到服务后,服务将执行以下操作:
- 生成随机值,并使用SHA256哈希1000次。
- 从私钥+散列随机值中生成一次性会话密钥。
- 使用SHA256 1000次对会话密钥进行哈希,然后用它来加密令牌
- 使用私钥使用RSA签名加密的令牌。
- 将加密的令牌+签名+散列随机值以未加密的JSON包发送给客户端。
当客户端调用服务时,它会向服务发送未加密的JSON包中的加密令牌和签名。服务将会:
- 从私钥+散列随机值中重新创建会话密钥
- 使用私钥验证签名
- 使用散列会话密钥解密令牌
- 检查令牌是否已过期
- 继续请求的操作...
我对加密一无所知,所以我有一些问题:
- 这是否足够或者过于复杂了?
由于所有通信都通过HTTPS进行,因此未加密的JSON数据包实际上直到到达客户端之前才会真正加密。
此外,我可能希望稍后在PHP中重新实现服务,因此所有内容都需要在PHP中可行。
感谢您的帮助