Почему ключ в символе # — и как это работает
В Secure Link мы говорим: ключ остаётся в URL после знака решётки.
И что? На практике это значит одну простую вещь. Сервер не видит всё, что идёт после #. Только ваш браузер знает про эту часть.
Допустим, кто-то перехватит запрос к серверу. Увидит шифртекст, но не ключ.
Да, звучит скучно. Однако именно из-за этой мелочи обычная ссылка становится безопасной. Ну, или почти безопасной.
Как устроен URL
Любой адрес в интернете делится на куски:
https://createsecurelink.com/page?search=hello#section1
^^^^^^^^^^^^^^^^^^^^
query fragmentЧасть с ?search=hello называется query. Она идёт на сервер вместе с запросом.
А вот #section1 — это фрагмент. Он остаётся в браузере.
Мы кладём ключ шифрования именно в фрагмент. Сервер получает запрос, отдаёт зашифрованную заметку. Браузер берёт ключ из адресной строки и расшифровывает локально. Сервер про ключ даже не знает.
Что летит по сети на самом деле
Покажу на примере. Вот плохой способ (так делать нельзя):
GET /note/abc123?key=SuperSecretKey HTTP/1.1 Host: createsecurelink.com
Ключ в query — и сервер его увидит. Плохо.
А вот правильный способ:
GET /note/abc123 HTTP/1.1 Host: createsecurelink.com
key=SuperSecretKey ← этого сервер не получает
В логах сервера будет только /note/abc123. Ключ никуда не уходит с вашего компьютера.
Простая схема. И работает.
Зачем такая заморочка
У нас три правила:
- 1Сервер хранит только зашифрованную каракатицу
- 2Ключ никогда не попадает на сервер
- 3Расшифровка происходит у вас в браузере
Получается что-то вроде:
[Ваш браузер] --шифрует--> [Каракатица] --отправляет--> [Сервер] ^ | | (ключа нет) | +------------- ключ в URL# ---------------------+
В итоге сервер физически не может прочитать вашу заметку. У него нет ключа.
Кстати, я сам поначалу думал — зачем такие сложности? Но когда разобрался, понял. Эта система довольно надёжная.
Что делают боты предпросмотра
Telegram, Slack и другие мессенджеры показывают превью ссылок. Их боты ходят по ссылке, но без фрагмента.
То есть бот запросит https://Secure Link.com/note/abc123, а всё после # просто проигнорирует.
Наш сервер в таких случаях:
- Отдаёт безопасное описание (не раскрывая содержимое)
- Не пытается быть слишком умным
- Ставит правильные заголовки кэширования
Заметка остаётся целой. Предпросмотр её не «сжигает».
Ошибки, которые всё портят
Вот где обычно люди прокалываются:
- 1Редирект портит ключ
Было: /note/abc#key=123
Стало: /note/abc?key=123 (после редиректа)
И ключ попал в query. Не делайте так.
- 1Аналитика логирует всё подряд
Google Analytics или Яндекс.Метрика могут случайно записать URL целиком. Нужно настроить их правильно.
- 1Слабое шифрование
Не экономьте на криптографии, серьёзно. Мы используем AES-GCM — проверенная штука.
- 1Скриншоты
Скрин с ключом в адресной строке — это как татуировка. Навсегда. Лучше избегайте.
- 1Всё в одном канале
Если ставите пароль на ссылку — отправляйте его отдельно. SMS, другой чат, что угодно.
Как пользоваться правильно
Несколько простых правил:
- Ставьте «один просмотр» и короткое время жизни
- Для важного добавляйте пароль (и передавайте его отдельно)
- Предупреждайте получателя: «Ссылка одноразовая, не пересылай»
- Сомневаетесь — сожгите заметку вручную после прочтения
Я обычно для паролей ставлю час жизни максимум. Для обычных заметок — сутки хватает.
Итого
URL-фрагмент — простая идея с большими последствиями.
Ключ у получателя, шифртекст на сервере. Всё.
Хотите делиться секретами без следов? Попробуйте одноразовые ссылки. Не сложнее обычной переписки, а спокойствия больше.
Хотя... может, обычного чата вам и хватит. Каждый сам решает.