Использование основанного на времени вращающегося хеша или строки для безопасности - PullRequest
5 голосов
/ 01 ноября 2011

В приложении CMS мне иногда нужно открывать фрейм другого домена. В данный момент я устанавливаю URL-адрес для этого iframe во что-то очень неясное. Как http://domain.com/iframe/jhghjg34787386/. Это работает, но теоретически, что URL-адрес источника iframe будет сохранен в истории пользователя и может быть доступен из внешнего мира.

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

Я мог бы сделать это, чтобы получить мой хэш:

<?php 

   $seed = '123456789'; // a password that both the parent and source have
   $string = md5(time().$seed); 
?>

Но тогда оба сервера должны быть точно синхронизированы. Есть ли способ сделать временное ограничение более размытым?

Я также открыт для других подходов. Есть ли способ проверить, что родительское окно для iframe имеет определенный домен?

Ответы [ 4 ]

7 голосов
/ 01 ноября 2011

Вы можете добавить ключ к вашему хешу и отправить метку времени с запросом, например ::

$key = "YOUR_SECRET_KEY";
$time = time();
$hash = hash_hmac('sha256', $time, $key);
$url = "https://example.com/iframe?hash=$hash&time=$time";

С другой стороны, вы должны сначала проверить, находится ли временная метка в пределах (например, не старше пяти минут), а затем перепроверять ключом и отправленной временной меткой. Если вы получили тот же хеш, запрос действителен.

Примечания:

  • не используйте MD5: алгоритм полностью сломан и больше не обеспечивает никакой безопасности (хотя при использовании с HMAC все еще должно быть в порядке ...)
  • Вы должны использовать hash_equals для сравнения хэшей, чтобы предотвратить время атаки
  • мы используем HMAC, чтобы гарантировать целостность данных и аутентификацию. См. https://crypto.stackexchange.com/questions/1070/why-is-hkx-not-a-secure-mac-construction, почему мы не должны просто объединять время и ключ
3 голосов
/ 01 ноября 2011

Вы не должны использовать обычный MD5;MD5 не предназначен для обеспечения подлинности сообщений.Вместо этого вы можете просто предоставить метку времени вместе с другой информацией (сообщением) в кодировке base64, чтобы она не содержала символ «:».Затем вы можете вычислить HMAC-код сообщения, например, с помощью

$hmac = hash_hmac("md5", $message, $secret)
$signed_message = $message . ":" . $hmac

. На другом конце вы можете проверить эту подпись, сначала разделив ":", получив $ message и $ hmac, затем выможно проверить подлинность с помощью

$hmac == hash_hmac("md5", $message, $secret)

Если коды совпадают, то проверьте, находится ли отметка времени в $message в допустимых пределах.

1 голос
/ 01 ноября 2011

Будьте осторожны при использовании MD5 для хеширования - он криптографически поврежден.Существует множество интернет-сайтов, которые помогают создавать коллизии.Скорее используйте что-то вроде SHA256 и всегда включайте длинную строку с солью.

Если пользователю не нужно взаимодействовать с сайтом в iframe, вы можете рассмотреть возможность очистки кода сайта и вставки его непосредственно в код.Для этого доступно несколько библиотек.

Как насчет использования чего-то вроде

$hash = hash ( "sha256" , date("h") . 'myverylongsaltstring' );

Пока серверы имеют правильные часовые пояса и синхронизированы с точностью до часа, этот подход будет работатькак ваш хэш time ().

Кроме того, вы можете использовать что-то вроде TinyUrl, чтобы скрыть ссылку немного дальше.Что-то вроде http://www.technabled.com/2008/12/create-your-own-tinyurl-with-php-and.html

0 голосов
/ 01 ноября 2011

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

Вы должны использовать UUID или что-то подобное.Вероятность столкновения была бы по существу невозможна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...