我正在使用C#实现REST Web服务,该服务将作为云服务托管在Azure上。由于它是REST服务,因此它是无状态的,因此没有cookie或会话状态。
网络……
你真的过度思考了这个令牌。说实话,最好的令牌安全依赖于随机性,或者更准确 不可预测性 。最好的代币是完全随机的。你是对的,一个问题是用户将修改他/她的令牌并使用它来访问其他人的帐户。这是一种常见的攻击,称为“会话窃取”。当令牌在服务器端随机生成并过期时,这种攻击几乎是不可能的。使用用户的信息(如IP和/或时间戳)是不好的做法,因为它可以提高可预测性。我在大学里做了一次攻击,成功猜出了基于服务器时间戳的活动令牌,以微秒为单位。该应用程序的作者认为微秒会变得足够快,以至于它们是不可预测的,但事实并非如此。
您应该知道,当用户位于代理服务器后面时,代理有时会以纯文本形式查看其SSL请求(出于安全考虑,许多代理将执行深度数据包检查)。因此,您可以使会话到期。如果你不这样做,你的用户就会受到这种攻击,以及可能的XSS和CSRF攻击。
只要合理的密钥长度,RSA或Rijndael就足够了。此外,您应该使用带有令牌的HMAC来防止篡改,即使您正在签名也是如此。从理论上讲,这将是多余的,因为您使用私钥进行签名。但是,HMAC经过了很好的测试,您对签名机制的实施可能存在缺陷。因此,最好使用HMAC。你会惊讶地发现有多少“自己动手”的安全实现存在导致他们妥协的缺陷。
你在安全方面听起来很精明。保持良好的工作!在这个世界上我们需要更多有安全意识的开发者。
编辑:
在令牌中包含时间戳/用户ID被认为是安全的,只要它们用强加密即可 对称 秘密密钥(如AES,Blowfish等),只有服务器才有,只要令牌包含防篡改哈希,如HMAC, 使用密钥和用户ID /时间戳加密 。散列保证完整性,加密保证机密性。
如果您没有在加密中包含HMAC(或其他哈希),则用户可以篡改加密令牌并将其解密为有效内容。我对服务器进行了攻击,其中用户ID和时间戳被加密并用作没有哈希的令牌。通过更改字符串中的一个随机字符,我能够将用户ID从58762更改为58531.虽然我无法选择“新”用户ID,但我能够访问其他人的帐户(这是在学术界,作为课程的一部分)。
另一种方法是使用完全随机的令牌值,并将其在服务器端映射到存储的用户ID /时间戳(它保留在服务器端,因此位于客户端控件之外)。这需要更多的内存和处理能力,但更安全。这是您必须根据具体情况做出的决定。
至于从IV和其他键重用/导出密钥,这通常是可以的,只要密钥仅在短时间内有效。在数学上,不太可能有人打破它们。但是有可能。如果你想走偏执路线(我通常这样做),随机生成所有新密钥。