Wróć do projektów
Web Development · Bezpieczeństwo
2026 Projekt własny

Vaultify

Zero-knowledge aplikacja webowa do jednorazowego udostępniania sekretów — hasła, klucze API i pliki szyfrowane lokalnie w przeglądarce, zanim cokolwiek trafi na serwer.

TypeScript
Język
Next.js 16
Framework
AES-256-GCM
Szyfrowanie
Zero-Knowledge
Architektura

Sekret, którego
serwer nie widzi

Vaultify pozwala utworzyć link zawierający zaszyfrowany sekret, który może zostać odszyfrowany wyłącznie przez posiadacza klucza. Klucz nigdy nie trafia do serwera — żyje jedynie we fragmencie adresu URL (#k=...), którego przeglądarki nie wysyłają.

Cała logika kryptograficzna działa lokalnie przez Web Crypto API, a backend przechowuje wyłącznie zaszyfrowany ciphertext i realizuje bezpieczny, jednorazowy odczyt danych z bazy.

🔒
Szyfrowanie w przeglądarce
AES-256-GCM przez Web Crypto API — serwer nigdy nie widzi treści ani klucza
🔥
Read-once
Atomowy odczyt-i-usunięcie (SELECT ... FOR UPDATE + DELETE) eliminuje race conditions
🔑
Ochrona hasłem
Klucz wyprowadzany z hasła przez PBKDF2 (600 000 iteracji), nie trafia do URL
🧩
Podział sekretu (Shamir)
Klucz dzielony na udziały (threshold scheme) nad GF(256)
🕵️
Tryb wabika (duress)
Jedno hasło, dwa niezależne szyfrowania — bez ujawniania, która ścieżka trafiła

Stack technologiczny

⚙️
TypeScript
Język główny projektu — pełne typowanie logiki kryptograficznej i UI.
Next.js 16
App Router — strony, routy API i layouty renderowane po stronie klienta i serwera.
🎨
Tailwind CSS
Utility-first stylowanie komponentów interfejsu.
🧱
shadcn/ui
Gotowe, dostępne komponenty UI budowane na Radix i Tailwind.
🎞️
Framer Motion
Animacje przejść i mikrointerakcji w interfejsie.
🔐
Web Crypto API
Natywne API przeglądarki — AES-GCM 256-bit oraz PBKDF2 do wyprowadzania kluczy.
🗄️
Supabase (Postgres)
Baza danych z Row Level Security i funkcjami SECURITY DEFINER do bezpiecznego odczytu.
⏱️
pg_cron
Cykliczne usuwanie przeterminowanych wpisów co ~15 minut.
Vercel
Hosting aplikacji Next.js z automatycznym deploymentem.

Jak to działa

01
Klucz nigdy nie trafia na serwer

W trybie bez hasła losowy klucz AES-GCM jest eksportowany do Base64URL i umieszczany wyłącznie we fragmencie adresu URL (#k=...).

const key =
  await generateEncryptionKey();
// url = `/s/${id}#k=${exportedKey}`
02
Szyfrowanie lokalne

Tekst lub plik jest szyfrowany w przeglądarce (AES-GCM, 12-bajtowy IV) zanim ciphertext trafi do Supabase.

const { ciphertext, iv } =
  await encryptData(plaintext, key);
03
Tryb z hasłem — PBKDF2

Klucz jest wyprowadzany z hasła przy użyciu PBKDF2 z solą (600 000 iteracji). Klucz nie opuszcza wtedy odbiorcy.

const key = await deriveKeyFromPassword(
  password, salt, 600000);
04
Read-once na poziomie bazy

Odczyt sekretu i jego usunięcie są atomowe, co eliminuje wyścig między dwiema równoczesnymi próbami odczytu.

SELECT ... FOR UPDATE;
DELETE FROM secrets
WHERE id = $1;
05
Shamir's Secret Sharing

Klucz może zostać podzielony na udziały nad GF(256), zgodnie z arytmetyką używaną przez AES.

const shares = splitSecretBytes(
  keyBytes, totalShares, threshold);
06
Tryb duress

Pod jednym hasłem ukryte są dwa niezależne szyfrowania. Aplikacja najpierw próbuje odszyfrować „prawdziwy” sekret, w razie niepowodzenia — wabik.

await decryptDuressSecret(
  ciphertext, password);

Operacyjne środki ochrony

RLSBrak publicznego SELECT — dostęp tylko przez funkcje SECURITY DEFINER
1xSekret usuwany atomowo po pierwszym odczycie
IVLosowy 12-bajtowy wektor inicjalizujący dla każdego szyfrowania
pg_cron czyści przeterminowane wpisy co ~15 minut
🔑Service role key nigdy nie trafia do klienta
#k=Fragment URL z kluczem nigdy nie jest wysyłany do serwera

Jak uruchomić

Wymagania
Node.js 18+ npm Konto Supabase Przeglądarka z Web Crypto API
1
Klonuj repozytorium i zainstaluj zależności
git clone https://github.com/Andrii418/Vaultify.git
cd Vaultify
npm install
2
Skonfiguruj zmienne środowiskowe
cp .env.example .env.local
# uzupełnij klucze projektu Supabase (anon / service role)
3
Uruchom w trybie deweloperskim
npm run dev
4
Build produkcyjny
npm run build
npm run start
Wszystkie projekty