gpt4 book ai didi

java - 在 App Engine servlet 中存储已用 token 列表 - java

转载 作者:行者123 更新时间:2023-12-01 14:46:10 24 4
gpt4 key购买 nike

我有一个小的 GAE 应用程序,它是我的 Android 应用程序的后端。我的应用程序中有一个 servlet,它从数据存储中提取数据并将其发送给用户。我不希望任何人都能够使用这个 servlet,因此我在应用程序中存储私钥,并且对于每个请求,我发送一个 token - 私钥和当前毫秒的哈希字符串,以及毫秒我在哈希中使用过。服务器获取毫秒和私钥,并将其与 token 进行比较。如果一切顺利,服务器会将毫秒存储在 HashSet 中,以便它知道不再使用它。 (有人可以嗅探设备数据 - 并一遍又一遍地发送相同的毫秒和 token )。

一开始,我在Servlet类中保留了一个静态字段,后来发现这是错误的,因为这个字段没有被持久化,当实例被销毁时,所有数据都会丢失。

我读过有关 Memcache 的内容,但这不是最佳解决方案,因为据我了解,如果应用程序电量不足,Memcache 中的数据可能会被删除内存,或者即使服务器出现故障。

我不想使用数据存储,因为它确实会使请求变慢。

我想我不是第一个遇到这个问题的人。怎么解决呢?

最佳答案

我在我的一个应用程序中使用了相反的方法:

每当有新客户端连接时,我都会在服务器上生成一组三个随机“挑战”(例如毫秒),并将其存储在内存缓存中,过期时间为一分钟左右。然后我将这些挑战发送给客户。对于客户端发出的每个请求,它需要使用这 3 个挑战之一(使用私钥进行哈希处理)。然后,服务器删除已使用的质询,创建一个新质询并将其发送给客户端。这样,每个挑战都是一次性的,我不必担心重播攻击。

关于此方法的一些注意事项:

  • 我生成 3 个挑战的原因是允许并行处理多个请求。
  • 您提出挑战的时间越长,随机重复使用该挑战的可能性就越小(从而允许播放攻击)。
  • 如果内存缓存忘记了我存储的挑战,应用程序的请求将会失败。在失败的响应中,我添加了“忘记所有其他挑战并使用这 3 个新挑战:...”命令。
  • 您可以将挑战与客户端的 IP 地址或某种其他类型的 session 信息联系起来,以降低有人“黑客攻击”您的可能性。
  • 一般来说,最好让服务器生成用于身份验证的质询或盐,而不是为客户端提供这种灵 active 。

如果您想坚持使用时间戳,可以使用的另一种方法是使用第一次请求交换来确定服务器实例和客户端设备之间的时间偏移。然后,仅接受具有“当前”时间戳的请求。为此,您需要确定获得时间偏移的不确定性,并将其用作时间戳不是当前时间戳的截止点。为了防止在该截止期内发生重放攻击,您可能需要保存并禁止使用最后几个时间戳。您可以在实例内部执行此操作,因为据我所知,AppEngine 会将来自同一客户端的请求优先路由到同一实例。然后,如果关闭实例并重新启动实例(即清除不允许缓存)所需的时间比“当前”截止时间更长,那么您应该不会遇到太多重放攻击问题。

关于java - 在 App Engine servlet 中存储已用 token 列表 - java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15419266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com