Подтвердить что ты не робот

Создание частных, уникальных, безопасных URL-адресов

Я бы хотел создать безопасный тип доступа с одним щелчком мыши, аналогичный приведенным ниже примерам. Я буду использовать 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 (ссылки для восстановления пароля)

4b9b3361

Ответ 1

Update:

Что-то вроде одного 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();
?>

Ответ 2

Попробуйте 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-адреса, созданные таким образом (независимо от алгоритма хеширования), не будут "безопасными", просто очень трудно угадать.

Ответ 3

Просто сгенерируйте 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;
    }
}

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

Ответ 4

Идентификатор должен быть невозможно догадаться, GUID уникальны, но не так сложно догадаться.

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

Затем вам нужно решить, как долго будет ваше случайное число, вы должны выбрать такую ​​длинную длину, что любой, угадающий номер, получит неназначенное число: либо

  • Оцените количество уникальных URL-адресов, которые вам нужно будет генерировать, подсчитайте, сколько бит вам нужно представлять для всех, а затем удвоить количество бит (по крайней мере).

  • Или, возьмите наибольшее число, которое ваши пользователи будут принимать

Теперь у вас есть "безопасный" номер, который вы можете просто преобразовать в десятичный, hex или base64 и использовать эту строку.

Ответ 5

Я бы избегал этого для:

1) Мгновенный вход в ярлык/значок для пользователей

потому что эти URL-адреса могут кэшироваться/регистрироваться в прокси-серверах, блогах, кеше браузера, закладках, электронной почте и т.д.

Ответ 6

Чтобы обрезать дополнительные фигурные скобки

$guid = strtolower (обрезка (com_create_guid(), "{}" )); (PHP 5 или новее)

Ответ 7

Если вы хотите убедиться, что URL-адрес уникален и может использоваться только ограниченное количество раз:

  • Храните небольшую базу данных с полями: RandomKey, InternalURL, Counter, TimeStamp

  • Создайте случайное число из достаточно большого пула.
    Необязательные GUID должны быть достаточными

  • Сохраните его в своей базе данных как RandomKey, а также фактический внутренний URL-адрес или код ресурса, необходимые вашей системе для обработки этого URL-адреса и отметки времени.

  • Когда пользователь нажимает или вводит URL-адрес, проверяйте его против этой базы данных: если значение TimeStamp слишком велико или Counter слишком велико, выполните соответствующие действия (например, если вы хотите, чтобы этот URL-адрес был быть доступным в течение ограниченного времени или определенного количества раз).
    В противном случае просто обработайте запрос с помощью InternalURL и отправьте его результат пользователю.

  • Когда URL-адрес был использован или достиг максимального счетчика использования, просто удалите его из базы данных, чтобы он больше не использовался.

Это здорово дать вам разовые URL-адреса, которые практически невозможно угадать.

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