Я хотел бы создать безопасный тип доступа с одним щелчком мыши, аналогичный приведенным ниже примерам. Я буду использовать PHP, но это не имеет значения, поскольку я просто хочу понять базовую концепцию. В некоторых ответах предлагается использовать GUID, но я не думаю, что это даст мне абсолютно уникальный, безопасный URL-адрес, как показано ниже.
# Google Calendar 3qq6jlu04ptlhmb9fencsu5t2k # Private 3qq6jlu04ptlhmb9fencsu5t2k # Private 'token' 163a0afe7fkb1ba2acd04c11ef0eefe8 # LogMeIn # 1024 bit - 128 Character URL 72oxuj0fzefqo3fu04xjtvmd0adj2948rfh7g5by4forkwcy7t651z7hcb6kjjgqkxmvmfqpyrcfy15z1fto8ewcxstjc6avicag7d5qnoimsm19kb9kgi9i7v6z01d5
Я склоняюсь к этому 128-значному, 1024-битовому стилю, поскольку он кажется очень безопасным. Наверное, я могу сделать четыре хэша MD5 и объединить их, но это действительно эффективно?
У меня есть два конкретных намерения для такого URL, но я уверен, что есть другие, которые могут найти это полезным.
1) Мгновенный вход в ярлык / значок для пользователей
2) URL единственного использования (ссылки восстановления пароля)
Обновить:
Для чего-то вроде одного URL-адреса использования, я бы пошел с приложением GUID-esque, которое было предложено. Убедитесь, что у вас короткая продолжительность жизни по ссылке.
Для мгновенного входа в систему нет надежного способа иметь один URL-адрес.
Да, вы можете создать URL-адрес, который будет почти невозможно догадаться, но это не дает вам надежной защиты. Если вы хотите запомнить пользователей, почему бы не использовать зашифрованный файл cookie для проверки подлинности?
В примере, который вы даете, Google Calendar не регистрирует вас через URL-адрес, вы должны пройти аутентификацию сначала до того, как URL-адрес означает что-либо.
Например, нажатие на календарь Google из моего gmail дает мне:
https://www.google.com/calendar/render?tab=mc&gsessionid=-LTeHrnKoeAbDcVaN68NHA
Это не поможет вам получить доступ к моей учетной записи, если вы не прошли проверку подлинности как меня.
Старый пост:
Вы можете сгенерировать GUID на PHP с помощью com_create _guid и использовать это.
На linux я думаю, что вы можете использовать uuid_create или этот код здесь :
<?php function guid(){ if (function_exists('com_create_guid')){ return com_create_guid(); }else{ mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up. $charid = strtoupper(md5(uniqid(rand(), true))); $hyphen = chr(45);// "-" $uuid = chr(123)// "{" .substr($charid, 0, 8).$hyphen .substr($charid, 8, 4).$hyphen .substr($charid,12, 4).$hyphen .substr($charid,16, 4).$hyphen .substr($charid,20,12) .chr(125);// "}" return $uuid; } } echo guid(); ?>
Попробуйте uniqid – и, возможно, в сочетании с хешем md5, как указано в примерах:
// no prefix // works only in PHP 5 and later versions $token = md5(uniqid()); // better, difficult to guess $better_token = md5(uniqid(rand(), true));
Однако я должен отметить, что никакие URL-адреса, созданные таким образом (независимо от алгоритма хеширования), не будут «безопасными», просто очень трудно угадать.
Просто сгенерируйте GUID. Это важно, хотя это не старый GUID старого стиля.
Однако, похоже, что php не имеет собственной функции генерации GUID. Функция com_create_guid, предложенная в другом ответе, доступна только в php при работе в Windows.
Для пользователя com_create_guid для не-Windows на странице руководства есть предложенная пользователем альтернатива:
function guid(){ if (function_exists('com_create_guid')){ return com_create_guid(); }else{ mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up. $charid = strtoupper(md5(uniqid(rand(), true))); $hyphen = chr(45);// "-" $uuid = chr(123)// "{" .substr($charid, 0, 8).$hyphen .substr($charid, 8, 4).$hyphen .substr($charid,12, 4).$hyphen .substr($charid,16, 4).$hyphen .substr($charid,20,12) .chr(125);// "}" return $uuid; } }
Но я должен признать, что не хотел бы использовать его для чего-либо важного, если бы в нем не было очевидной проблемы, что мой некриптографически обученный ум не заметил.
Идентификатор должен быть невозможно догадаться, GUID уникальны, но не так сложно догадаться.
Вам нужен хороший генератор случайных чисел, каждая библиотека криптографии / шифрования имеет хотя бы одну, я не знаю PHP, поэтому я не могу дать вам имя функции.
Затем вам нужно решить, как долго будет ваше случайное число, вы должны выбрать такую длинную длину, что любой, угадывающий номер, получит неназначенное число – либо:
Оцените количество уникальных URL-адресов, которые вам нужно будет генерировать, подсчитайте количество бит, которое вам нужно, чтобы представить их все, а затем удвоить количество бит (по крайней мере).
Или, возьмите наибольшее число, которое ваши пользователи будут принимать
Теперь у вас есть «безопасный» номер, который вы можете просто преобразовать в десятичный, hex или base64 и использовать эту строку.
Я бы избегал этого:
1) Мгновенный вход в ярлык / значок для пользователей
потому что эти URL-адреса могут кэшироваться / регистрироваться в прокси-серверах, блогах, кеше браузера, закладках, электронных письмах и т. д.
Чтобы обрезать дополнительные фигурные скобки
$ guid = strtolower (обрезка (com_create_guid (), "{}")); (PHP 5 или новее)
Если вы хотите, чтобы URL был уникальным и может использоваться только ограниченное количество раз:
Храните небольшую базу данных с полями: RandomKey
, InternalURL
, Counter
, TimeStamp
Создайте случайное число из достаточно большого пула.
Необязательные GUID должны быть достаточными
Сохраните его в своей базе данных как RandomKey
вместе с фактическим внутренним URL-адресом или кодом ресурса, необходимым вашей системе для обработки этого URL-адреса и RandomKey
времени.
Когда пользователь нажимает или вводит URL-адрес, проверяйте его против этой базы данных: если TimeStamp
слишком старый или Counter
слишком высок, предпримите соответствующие действия (например, если вы хотите, чтобы этот URL-адрес был доступен в течение ограниченного времени или определенного номера раз).
В противном случае просто обработайте запрос с помощью InternalURL
и отправьте его результат пользователю.
Когда URL-адрес был использован или достиг максимального счетчика использования, просто удалите его из базы данных, чтобы он не мог использоваться.
Это здорово дать вам разовые URL-адреса, которые практически невозможно догадаться.
Конечно, вы также должны выполнить некоторые проверки безопасности, чтобы ограничить скорость, с которой люди могут пытаться получить доступ к недопустимому URL.