繁体   English   中英

REST Web服务身份验证令牌实现

[英]REST Web Service authentication token implementation

我正在使用C#实现REST Web服务,该服务将作为云服务托管在Azure上。 由于它是REST服务,因此它是无状态的,因此没有cookie或会话状态。

只能通过HTTPS(StartSSL.com提供的证书)访问Web服务。

用户成功登录服务后,将获得安全令牌。 此令牌将在将来的通信中提供身份验证。

令牌将包含客户端的时间戳,用户ID和IP地址。

所有通信都只通过HTTPS进行,因此我不担心在重放攻击中被拦截和使用的令牌; 无论如何,令牌将有一个到期日。

由于这是面向公众的服务,我担心有人可以注册服务,登录然后修改他们收到的令牌以访问其他用户的帐户。

我想知道如何最好地保护令牌的内容,并验证它没有被篡改。

我计划执行以下操作来保护令牌:

客户端成功登录服务,服务执行:

  1. 生成随机值并使用SHA256哈希值1000次。
  2. 从私钥+散列随机值生成一次性会话密钥。
  3. 使用SHA256对会话密钥进行1000次散列,然后使用它来加密令牌
  4. 使用私钥使用RSA对加密令牌进行签名。
  5. 将加密的令牌+签名+散列随机值发送到未加密的JSON包中的客户端。

当客户端调用服务时,它会将未加密的JSON包中的加​​密令牌和签名发送到服务。 服务会

  1. 从私钥+散列随机值重新创建会话密钥
  2. 使用私钥验证签名
  3. 使用散列会话密钥解密令牌
  4. 检查令牌是否已过期
  5. 继续请求的操作......

我对加密一无所知,所以我有一些问题:

  1. 这是足够的还是过度杀伤?
  2. 我读到这是为了检测篡改我应该包含带有令牌的HMAC。 由于我使用私钥签名,我还需要HMAC吗?
  3. 我应该使用Rijndael而不是RSA吗?
  4. 如果Rijndael是首选,那么生成的IV是否需要解密? 即我可以扔掉它还是我需要发送加密令牌? 例如,加密令牌+ HMAC + IV +散列随机值。

由于所有通信都通过HTTPS进行,因此未加密的JSON包在到达客户端之前不会真正解密。

此外,我可能希望稍后在PHP中重新实现该服务,所以这一切都需要在PHP中可行。

谢谢你的帮助

你真的过度思考了这个令牌。 说实话,最好的令牌安全性依赖于随机性,或者更准确地说是不可预测性 最好的代币是完全随机的。 你是对的,一个问题是用户将修改他/她的令牌并使用它来访问其他人的帐户。 这是一种常见的攻击,称为“会话窃取”。 当令牌在服务器端随机生成并过期时,这种攻击几乎是不可能的。 使用用户的信息(如IP和/或时间戳)是不好的做法,因为它可以提高可预测性。 我在大学里做了一次攻击,成功猜出了基于服务器时间戳的活动令牌,以微秒为单位。 该应用程序的作者认为微秒会变得足够快,以至于它们是不可预测的,但事实并非如此。

您应该知道,当用户位于代理服务器后面时,代理有时会以纯文本形式查看其SSL请求(出于安全考虑,许多代理将执行深度数据包检查)。 因此,您可以使会话到期。 如果你不这样做,你的用户就会受到这种攻击,以及可能的XSS和CSRF攻击。

只要合理的密钥长度,RSA或Rijndael就足够了。 此外,您应该使用带有令牌的HMAC来防止篡改,即使您正在签名也是如此。 从理论上讲,这将是多余的,因为您使用私钥进行签名。 但是,HMAC经过了很好的测试,您对签名机制的实施可能存在缺陷。 因此,最好使用HMAC。 你会惊讶地发现有多少“自己动手”的安全实现存在导致他们妥协的缺陷。

你在安全方面听起来很精明。 保持良好的工作! 在这个世界上我们需要更多有安全意识的开发者。

编辑:

只要服务器具有强对称密钥(如AES,Blowfish等)并且令牌包含防篡改哈希,就可以在令牌中包含时间戳/用户ID与HMAC一样, 它使用密钥和用户ID /时间戳加密 散列保证完整性,加密保证机密性。

如果您没有在加密中包含HMAC(或其他哈希),则用户可以篡改加密令牌并将其解密为有效内容。 我对服务器进行了攻击,其中用户ID和时间戳被加密并用作没有哈希的令牌。 通过更改字符串中的一个随机字符,我能够将用户ID从58762更改为58531.虽然我无法选择“新”用户ID,但我能够访问其他人的帐户(这是在学术界,作为课程的一部分)。

另一种方法是使用完全随机的令牌值,并将其在服务器端映射到存储的用户ID /时间戳(它保留在服务器端,因此位于客户端控件之外)。 这需要更多的内存和处理能力,但更安全。 这是您必须根据具体情况做出的决定。

至于从IV和其他键重用/导出密钥,这通常是可以的,只要密钥仅在短时间内有效。 在数学上,不太可能有人打破它们。 但是有可能。 如果你想走偏执路线(我通常这样做),随机生成所有新密钥。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM