2010-03-02 4 views
16

Я хочу, чтобы у пользователя была возможность выбрать «помнить меня» на моем веб-сайте, поэтому им не нужно входить в систему каждый раз, когда они приходят. Итак, мне нужно сохранить уникальный идентификатор в файле cookie, чтобы идентифицировать их. Безопасно ли хешировать свой пароль с помощью sha512 и длинной соли в PHP и хранить это значение в cookie? Если печенье было украдено, будет ли их пароль подвержен риску? Очевидно, что это должно быть связано с их паролем, иначе, если значение cookie было угано или украдено, пользователь не сможет остановить регистрацию другого пользователя.Желательно хранить хешированный пароль в файле cookie?

Кроме того, желательно ли использовать GUID вообще как уникальный идентификатор?

Спасибо, Бен

+4

Вам не нужно будет хранить пароль, чтобы «запомнить» пользователей, не так ли? –

+0

@ o.k.w: Он скорее используется для повторной проверки подлинности пользователя. – Gumbo

ответ

3

Там очень низкий риск с хорошим алгоритмом и большой солью, но зачем ненужный риск?

Если вам просто нужно идентифицировать пользователя, сохраните то, что может однозначно идентифицировать пользователя, например, руководство вместе с другим сохраненным кодом подтверждения (а не их паролем, некоторой случайной длинной строкой). Я бы не использовал руководство, так как это не был бы безопасный метод аутентификации.

+0

Желательно удалить или изменить эту «случайную длинную строку», когда/если пароль был изменен, чтобы пользователь (или кто-то из указанного файла cookie) не мог представить такой файл cookie через некоторое время после изменения пароля (или пользователя de-selected the remember me, или ...) – mjv

+4

«Случайная длинная строка» должна истекать гораздо чаще, чем когда пароль изменяется, в идеале при каждом входе в систему. –

+1

Строка указывает на пользователя. Это не имеет никакого отношения к аутентификации. Вы можете удалить его, когда хотите истечь кешированные учетные данные, что на самом деле не связано с изменением пароля. –

21

Помните, что хэш пароля фактически совпадает с их паролем. Кто-то, кто украл хэш, будет иметь тот же доступ к учетной записи пользователя, как если бы он украл свой пароль. Поэтому не рекомендуется хранить хэш пароля пользователя в файле cookie, если не было другой информации не, хранящейся в файле cookie, который используется для аутентификации (то есть двухфакторной аутентификации).

+0

+1 точно, в противном случае вопрос в том, что даже хэширование пароля в первую очередь? Он предназначен для задержки злоумышленника! – rook

+2

Интересно, почему кто-то проголосовал за этот ответ. – Gabe

+0

это, конечно, предполагает, что злоумышленник знает, какой алгоритм хеширования используется и используется ли соль ... все же, не рекомендуется – zzzzBov

2

Не было бы вреда иметь какой-то «пароль» в файле cookie вместе с идентификатором пользователя (чтобы пользователи не меняли uid на другого пользователя), просто не делайте «пароль» так же как и пароль пользователя.

И только потому, что это хеш, не обязательно означает, что он односторонний (ну, по определению, он есть, но есть утилиты для генерации открытых текстов MD5, и я предполагаю, что это всего лишь вопрос времени, прежде чем это произойдет с другими). Я хотел бы получить дополнительный пароль.

12

Here - отличная статья по этой теме. Многие ответы на ваш вопрос затрагивают описанные в нем методы.

+0

Спасибо Крис, это действительно отличная статья –

2

Альтернативным способом сделать это может быть использование файла cookie в качестве зашифрованного хранилища только для данных о косвенности. Вам понадобится какой-то незашифрованный идентификатор, который будет служить указателем на ключ (или необходимую информацию для получения ключа) в базе данных приложения, за которым следует blob, зашифрованный ключом, полученным из идентификатора, который сам будет содержать своего рода одноразовый идентификатор, который аутентифицирует сеанс.

Учитывая следующие допущения:

  • Ваша база данных находится в безопасности (например, ваше приложение может получить доступ к нему, но ваш пользователь не может напрямую сделать это, а также при условии, что заявка была оборудована устройством против инъекции SQL)
  • Ваши соли сильны; то есть, достаточно высокая энтропии достаточно того, что попытки взломать подсоленной пароль неосуществимо, даже если пароль известен

Тогда что это обеспечит метод, с помощью которого можно с достаточной степенью уверенности, что сессия не может быть захваченным или украденным каким-либо образом.То есть скопированный файл cookie имеет ограниченную полезность, поскольку пользователь не должен использовать cookie между его кражей и использованием злоумышленником.

Хотя это защищает от повторного воспроизведения, это также означает, что если кому-то удастся украсть файл cookie точно в нужное время, и ему также удастся использовать его до того, как оригинальный, законный пользователь сделает это, злоумышленник теперь контролирует сессия. Можно ограничить сеанс IP-адресом для уменьшения этого риска (несколько: если и пользователь, и злоумышленник находятся за одним и тем же NAT, что является наиболее вероятным сценарием в любой домашней или малой и среднесрочной бизнес-сети), то этот момент довольно спорный вопрос, так как IP-адрес, казалось бы, то же самое в любом случае. Также полезным может быть ограничение для текущего пользовательского агента (хотя это может неожиданно ломаться, если пользователь обновляет свой браузер, а сеанс не истекает при закрытии браузера) или найти какой-либо метод, с помощью которого можно определить компьютер, на котором находится пользователь достаточно хорошо, что есть разумная уверенность в том, что пользователь не переместил файл cookie из одной системы в другую. Если не использовать какой-либо бинарный плагин (Flash или Silver/Moonlight), я не уверен, что последнее возможно.

Для защиты от постоянного захвата сеанса требуется, чтобы пользователь периодически повторно проверял себя (например, ограничивал продолжительность сеанса сеанса или требовал что-то вроде токена/фоб/ключа) и требовал, чтобы пользователь повторно аутентифицировал его - или себя при входе в чувствительные области приложения, такие как смена пароля и потенциально опасные действия, шаблоны или поведение, такие как удаление данных, необычные шаблоны использования, массовые действия и т. д.

Трудно защитить приложения и при этом сохранить их простоту использования. Если все сделано осторожно, безопасность может быть реализована таким образом, чтобы она была минимально навязчивой и, тем не менее, эффективной, но для большинства приложений, ориентированных на Интернет.

Смежные вопросы