Реализация генерации ключа HttpSession - PullRequest
3 голосов
/ 08 августа 2010

Я пытаюсь реализовать генерацию ключа HttpSession

Я генерирую случайное число от 1 000 000 до 9 999 999 и отправляю его в виде файла cookie пользователю.

Можно ли сделать этот процесс безопасным? любой может сделать случайное число и попытаться получить доступ к моему серверу ... может быть, мне нужен больший диапазон?

Другой вопрос: как мне сгенерировать число, которое я не генерировал раньше? Прямо сейчас я регенерирую каждый раз, когда этот номер используется, возможно ли сделать это лучше?

Ответы [ 3 ]

3 голосов
/ 08 августа 2010

Используйте UUID . В частности, UUID.randomUUID(). Вот обсуждение о вероятности столкновения.

2 голосов
/ 08 августа 2010

Звучит так, будто вы пытаетесь реализовать базовую аутентификацию.Что-то попробовать (в псевдокоде; я не очень хорошо разбираюсь с 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-адреса.Вы также можете использовать метку времени, чтобы убедиться, что сессия пользователя истекает со временем.Это не даст хакерам просто сгенерировать хорошее число и использовать его вечно.

Что касается секрета, то это случайный фрагмент текста.Он должен быть абсолютно случайным и никогда не передаваться.Это в основном делает ваши токены практически невозможными для обратного инжиниринга (в противном случае, это вопрос использования комбинаций, таких как «timestamp ip», «ip number timestamp» и т.это может быть лучше достигнуто с HMAC, но это может быть несколько излишним для того, что вы хотите сделать.Это решение будет чертовски хорошо работать как есть.

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ

Следует отметить, что ваши секреты должныбыть одинаковым для проверки работоспособности.

1 голос
/ 09 августа 2010

Я задал себе тот же вопрос и нашел здесь отличный ответ: Создать GUID / UUID в JavaScript?

Тебе лучше прочитать подробнее о RFC 4122, чтобы понять, что ты имеешь в виду .. Я использую этот псевдокод для проекта NodeJS, и он выполняет свою работу.

Кстати: вам нужно более 7 цифр, чтобы быть в безопасности.

...