我正在尝试实现一代HttpSession密钥
我正在生成1,000,000到9,999,999之间的随机数,并将其作为Cookie发送给用户。
是否可以确保此过程安全? 任何人都可以制作这样的随机数并尝试访问我的服务器...也许我需要更大的范围?
另一个问题是,如何生成我之前没有生成的数字?现在我每次使用该数字时都会重新生成,是否可以更好地进行此操作?
答案 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位数字。