实现一代HttpSession密钥

时间:2010-08-08 00:19:43

标签: java security cookies random httpsession

我正在尝试实现一代HttpSession密钥

我正在生成1,000,000到9,999,999之间的随机数,并将其作为Cookie发送给用户。

是否可以确保此过程安全? 任何人都可以制作这样的随机数并尝试访问我的服务器...也许我需要更大的范围?

另一个问题是,如何生成我之前没有生成的数字?现在我每次使用该数字时都会重新生成,是否可以更好地进行此操作?

3 个答案:

答案 0 :(得分:3)

使用UUID。具体而言,UUID.randomUUID()Here's a discussion关于碰撞的可能性。

答案 1 :(得分:2)

这听起来很像你正试图实现一些基本身份验证。尝试的东西(在伪代码中;我在网上使用Java并不是很好):

random_number = rand(1000000, 9999999);
secret = "Some random text here";
timestamp = unix_timestamp(); // Get a UNIX timestamp
user_ip = users_ip(); // Get the user's IP
setcookie("random_number", random_number); // Save the random number
setcookie("timestamp", timestamp);
setcookie("token", sha256(random_number + secret + timestamp + ip)); // Concat and hash everything to form a token

如果要检查随机数是否有效,只需将所有部分重新拉回来并将其与令牌进行比较:

random_number = getcookie("random_number");
secret = "Some random text here";
timestamp = int(getcookie("timestamp"));
user_ip = users_ip(); // Get the user's IP
token = sha256(random_number + secret + timestamp + ip);

if(unix_timestamp() - timestamp < 0 || unix_timestamp() - timestamp > timeout) {
    // The token is more than an hour old; it might have been stolen.
}
if(token == getcookie("token")) {
    // The user is valid
} else {
    // The user is invalid
}

此代码会阻止某人欺骗随机数,确保它来自同一个IP。您还可以使用时间戳记来确保用户的会话随着时间的推移而过期。这将使黑客无法简单地生成一个好的数字并永远使用它。

至于秘密,这是一个随机文本块。它应该是完全随机的,永远不会被共享。它基本上使您的令牌几乎不可能进行逆向工程(否则,这是尝试组合,如“数字时间戳ip”,“IP号码时间戳”等)。

还应该注意的是,使用HMAC可以更好地完成这样的事情,但是对于你想要做的事情来说,这可能有些过分。这个解决方案将会按原样做得很好。

希望这有帮助。

修改

应该注意的是,您的秘密必须与验证工作相同。

答案 2 :(得分:1)

我问自己同样的问题并在这里找到了一个很好的答案: Create GUID / UUID in JavaScript?

您最好阅读有关RFC 4122的更多信息,看看这是不是您的意思.. 我正在将这个伪代码用于NodeJS项目并完成工作。

BTW:为了安全起见,您需要超过7位数字。