Self-hosted, Zero-Knowledge File Sharing Service.
Безопасный, анонимный и стильный сервис для обмена файлами, текстом и изображениями. Данные шифруются в браузере, сервер никогда не видит содержимое.
- 🔐 End-to-End Шифрование: Все данные шифруются (AES-GCM 256) на клиенте с использованием Web Crypto API. Сервер хранит только зашифрованные байты.
- 🪃 Secure Reverse Drop (НОВОЕ): Возможность создать "Шлюз" (обратную ссылку). Вы отправляете ссылку собеседнику, и он может безопасно передать вам файл. Используется гибридное шифрование (RSA-OAEP + AES), гарантирующее, что прочитать файл сможет только создатель ссылки.
- 🖼️ Rich Media Support (НОВОЕ):
- Отдельная вкладка для отправки Изображений.
- Поддержка Drag & Drop и вставки из буфера обмена (Ctrl+V).
- Безопасный просмотр картинок прямо в браузере получателя (расшифровка в
BlobURL без сохранения на диск).
- 🏎️ Chunked Uploads: Поддержка файлов любого размера (хоть 10 Гб). Данные загружаются и шифруются потоково (кусками по 4 МБ), не перегружая оперативную память.
- 🧅 Layered Security:
- Базовая ссылка содержит ключ после
#(сервер его не видит). - Опциональная защита паролем (двойное шифрование ключа "Матрешка").
- Базовая ссылка содержит ключ после
- 📱 Mobile Friendly: Адаптивный "Cyberpunk" дизайн (Dark Mode), QR-коды для передачи на телефон с возможностью скачивания PNG.
- 💣 Самоуничтожение: Файлы удаляются физически (shredding) сразу после скачивания или по истечению таймера (TTL).
- 💾 No Database: Работает без SQL/Redis. Использует файловую систему для хранения метаданных (Sidecar pattern), что упрощает бэкапы.
- 🐳 Docker Ready: Полностью готов к развертыванию в контейнерах.
- Backend: ASP.NET Core 8 (Razor Pages)
- Frontend: Vanilla JS (ES6+), Web Crypto API, Bootstrap 5
- Streaming: StreamSaver.js (для сохранения больших файлов сразу на диск)
- Storage: Local Filesystem (Flat-file DB pattern)
Самый простой способ запустить VoidDrop — использовать docker-compose.
version: '3.8'
services:
voiddrop:
image: voiddrop:latest
build: .
container_name: voiddrop
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- ./void-data:/data
environment:
- ASPNETCORE_URLS=http://+:8080
- AppConfig__StoragePath=/data
- AppConfig__CleanupIntervalMinutes=10
# Разрешаем загрузку до 10 ГБ (в байтах)
- AppConfig__MaxUploadSizeBytes=10737418240- Сохраните код выше в
docker-compose.yml. - Запустите:
docker-compose up -d --build
- Откройте
http://localhost:8080.
Важно: Для работы криптографии в современных браузерах (Clipboard API, Web Crypto) требуется HTTPS или
localhost. В продакшене обязательно используйте Reverse Proxy (Nginx/Caddy) с SSL сертификатом.
Приложение настраивается через переменные окружения (Environment Variables):
| Переменная | По умолчанию | Описание |
|---|---|---|
AppConfig__StoragePath |
SecretData |
Путь к папке, где хранятся зашифрованные файлы и метаданные. |
AppConfig__CleanupIntervalMinutes |
10 |
Как часто запускать фоновый процесс очистки просроченных файлов. |
AppConfig__MaxUploadSizeBytes |
5368709120 |
Максимальный размер файла (байт). Default: 5 GB. |
В проекте используются два различных подхода к шифрованию в зависимости от сценария.
Сценарий: "Я хочу отправить файл другу".
- Генерация: Клиент генерирует случайный
Master Key(AES-256). - Шифрование: Файл нарезается на чанки. Каждый чанк шифруется
AES-GCMс уникальным IV. - Передача: Зашифрованные чанки летят на сервер. Ключ кодируется в Base64 и добавляется в URL якорем (
#Key). - Пароль (опционально): Если установлен пароль,
Master Keyзаворачивается в ключ, полученный из пароля (PBKDF2), и только потом сохраняется. Сервер видит только крипто-мусор.
Сценарий: "Я хочу получить файл от друга, но у нас нет безопасного канала для обмена ссылками".
Используется Гибридное шифрование (Hybrid Encryption).
- Инициализация (Получатель):
- Браузер генерирует пару ключей RSA-OAEP 2048 (Public + Private).
- Private Key остается в RAM браузера.
- Public Key отправляется на сервер для создания "Комнаты ожидания".
- Отправка (Отправитель):
- Отправитель переходит по ссылке и получает Public Key.
- Файл шифруется быстрым симметричным ключом (
AES-GCM). - Сам AES-ключ шифруется асимметричным RSA Public Key.
- Зашифрованный пакет ("конверт") отправляется на сервер.
- Получение:
- Браузер Получателя видит пакет.
- Расшифровывает AES-ключ своим Private Key.
- Использует AES-ключ для расшифровки и отображения файла.
Безопасность: Даже если ссылка на запрос перехвачена злоумышленником, он может только отправить файл, но не может прочитать то, что отправят вам другие, так как у него нет Private Key (который живет только в вашей вкладке браузера).
Проект создан в уникальном коллаборативном режиме "Человек + ИИ":
- 💻 Code & Implementation: [Gemini 3 Pro Preview / AI Assistant]
- Написал 99% кода (C#, JS, CSS).
- Реализовал криптографию (AES + RSA) и логику потоков.
- 🧠 Architecture & Prompts: [Максим / KuzarinM ]
- Идея, требования безопасности, архитектурный надзор.
- Тестирование на прочность и дизайн-ревью.
- Помогал ИИ не сойти с ума.