2

我正在创建一个应用程序,其中客户端向服务器发送请求,然后获取唯一的请求 ID。当客户端想要再次与服务器交互时,将使用这个唯一的请求 ID 对客户端进行身份验证。

客户端的请求分为两种:

  1. 新请求,它没有现有的 id,并且来自服务器的响应生成并返回一个 id。
  2. 带有 id 的现有请求。然后服务器处理客户端对提供的 id 的请求。

我的问题是如何生成 id?我正在使用 Java 和 MySQL 服务器数据库。如果我使用自动递增的数据库生成的 id,那么客户端就很容易猜出 id。另一个客户端可以通过猜测和滥用它们来恶意生成一些 id(客户端/服务器之间没有身份验证,除了 id :< )

如果我使用 UUID 或其他随机算法生成随机 id,那么我需要检查整个数据库(可能有数千条记录),以真正检查并保证随机 id 是否确实是唯一的?还是在数据库中快速检查 id 是否存在并且不会导致性能问题?

我应该采取什么措施?除了唯一 ID 之外,我是否需要对客户端和服务器之间的身份验证采取更多安全措施?

4

6 回答 6

2

为每个会话创建一个编码且唯一的密钥,该密钥将使用您拥有的该用户的唯一数据创建,例如他的电子邮件、当前时间等。

String yourString = "user@email.com"+"timestamp"; 
byte[] bytesOfMessage = yourString.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(bytesOfMessage);

将为每个请求生成一个唯一的 id,将它们存储在数据库中的一个表中,其中包含到期时间戳、用户 ID 和密钥。在每个请求上,如果它仍然有效,则更新“到期”时间,如果它过期或无效,则返回错误。

我使用的有效键表类似于:

userId(int)
key(varchar(32))
expiry(int)

然后,如果您想查看用户是否打开了有效会话,您只需检查该表userId并确保它是唯一列,以避免存储以前会话的历史记录。

于 2012-05-21T11:25:53.747 回答
2

您可以使用 Java 的 UUID。就像是 :

UUID uniqueKey = UUID.randomUUID();

如果你不想使用它,你可以使用时间,因为它总是在变化,如果你想确定的话,添加一个随机数。

于 2012-05-21T11:27:52.147 回答
2

使用java.util.UUID.randomUUID();您可以生成加密安全的随机 UUID。

由于 UUID 是 128 位长,因此发生冲突的机会可以忽略不计,但如果您真的想检查冲突,您可以通过将活动 UUID 存储在数据库中并在生成后检查重复项来做到这一点。

于 2012-05-21T11:29:11.403 回答
2

如果您使用Spring Framework,您可能会发现另一个有用的 UUID 实现org.springframework.util.AlternativeJdkIdGenerator

IdGenerator generator = new AlternativeJdkIdGenerator();
UUID uuid = generator.generateId();

这是来自文档:

一个 {@link IdGenerator},它使用 {@link SecureRandom} 作为初始种子,然后 * {@link Random},而不是每次 * 调用 {@link UUID#randomUUID()} 作为 {@link org.springframework.util .JdkIdGenerator JdkIdGenerator} 可以。* 这在安全随机 ID 和性能之间提供了更好的平衡。

于 2017-07-18T14:31:32.227 回答
1

如果您想在 MySQL 端生成它,我认为这会很好

md5(concat(UNIX_TIMESTAMP(),<user_id>)) 

如果该字段被索引,查询不会花费很长时间。

于 2012-05-21T11:30:19.110 回答
0
  1. Use a UUID to generate a base ID that is nearly always unique.
  2. Hash the base ID to make it difficult for clients to guess and spoof.
  3. Store the hashed ID in the database using a column with a unique constraint.
  4. On the rare occasion the unique constraint is violated, repeat the above steps.
于 2012-05-21T14:44:56.390 回答