Password-manager

Lockyt Logo # Lockyt **A zero-knowledge, end-to-end encrypted password manager built for the modern web.** [![React](https://img.shields.io/badge/React-18-61dafb?style=flat-square&logo=react&logoColor=white)](https://react.dev) [![Firebase](https://img.shields.io/badge/Firebase-Firestore-orange?style=flat-square&logo=firebase&logoColor=white)](https://firebase.google.com) [![Tailwind CSS](https://img.shields.io/badge/Tailwind-CSS-38bdf8?style=flat-square&logo=tailwindcss&logoColor=white)](https://tailwindcss.com) [![License](https://img.shields.io/badge/License-MIT-a78bfa?style=flat-square)](./LICENSE) [Live Demo](https://your-lockyt-url.com) Β· [Chrome Extension](#chrome-extension) Β· [Report Bug](https://github.com/yourusername/lockyt/issues) Β· [Request Feature](https://github.com/yourusername/lockyt/issues)

πŸ“Έ Screenshots

| Dashboard | Security Center | |:---------:|:---------------:| | Dashboard | Security Center | | Vault Entry | Password Generator | |:-----------:|:-----------------:| | Vault Entry | Password Generator | | Mobile View | Chrome Extension | |:-----------:|:----------------:| | Mobile View | Chrome Extension |

πŸ” What is Lockyt?

Lockyt is a full-stack password manager that stores, encrypts, and syncs your credentials across all devices β€” without ever exposing your plaintext data to the server.

All encryption and decryption happens entirely in your browser. Your master password is never transmitted, never stored, and never seen by anyone but you. Even if the database were compromised, attackers would only find AES-256 encrypted ciphertext.


✨ Features

Vault

Security

Tools

Cross-device


πŸ—οΈ Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Client (Browser)                  β”‚
β”‚                                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                β”‚
β”‚  β”‚  React App  β”‚    β”‚   Chrome     β”‚                β”‚
β”‚  β”‚  (Vite)     β”‚    β”‚  Extension   β”‚                β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜                β”‚
β”‚         β”‚                  β”‚                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”                β”‚
β”‚  β”‚         crypto.js               β”‚                β”‚
β”‚  β”‚  PBKDF2 key derivation          β”‚                β”‚
β”‚  β”‚  AES-256-GCM encrypt/decrypt    β”‚                β”‚
β”‚  β”‚  (Web Crypto API β€” no deps)     β”‚                β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                  β”‚ Encrypted ciphertext only
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   Firebase                           β”‚
β”‚                                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”               β”‚
β”‚  β”‚ Firebase Authβ”‚    β”‚  Firestore   β”‚               β”‚
β”‚  β”‚ (Identity)   β”‚    β”‚  (Storage)   β”‚               β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Data stored in Firestore

users/
└── {uid}/
    β”œβ”€β”€ vault/
    β”‚   └── meta              ← encrypted canary (verifies master password)
    └── passwords/
        └── {entryId}
            β”œβ”€β”€ site          ← plain  (for search)
            β”œβ”€β”€ username      ← plain  (for display)
            β”œβ”€β”€ password      ← AES-256-GCM encrypted
            β”œβ”€β”€ cardNumber    ← AES-256-GCM encrypted
            β”œβ”€β”€ notes         ← AES-256-GCM encrypted
            └── ...

---

## πŸš€ Getting Started

### Prerequisites

- Node.js 18+
- A Firebase project with **Firestore** and **Authentication** enabled

### 1. Clone the repository

```bash
git clone https://github.com/Rajat2774/Password-manager.git
cd Lockora

2. Install dependencies

npm install

3. Configure Firebase

Create src/firebase.js with your Firebase config:

import { initializeApp } from "firebase/app";
import { getAuth, GoogleAuthProvider } from "firebase/auth";
import { getFirestore } from "firebase/firestore";

const firebaseConfig = {
  apiKey:            "YOUR_API_KEY",
  authDomain:        "YOUR_PROJECT.firebaseapp.com",
  projectId:         "YOUR_PROJECT_ID",
  storageBucket:     "YOUR_PROJECT.appspot.com",
  messagingSenderId: "YOUR_SENDER_ID",
  appId:             "YOUR_APP_ID",
};

const app = initializeApp(firebaseConfig);
export const auth = getAuth(app);
export const googleProvider = new GoogleAuthProvider();
export const db = getFirestore(app);

4. Set Firestore security rules

In the Firebase Console β†’ Firestore β†’ Rules:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId}/vault/{document} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
    match /users/{userId}/passwords/{document} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
    }
  }

5. Run locally

npm run dev

Open http://localhost:5173


🧩 Chrome Extension

The Lockyt Chrome Extension enables autofill on any website.

Install from source

  1. Open chrome://extensions
  2. Enable Developer mode
  3. Click Load unpacked
  4. Select the lockora-extension/ folder

Configure

Edit lockora-extension/firebase-config.js with your Firebase config (same as above).

How it works

User visits a site with a login form
            ↓
Extension detects the form (content.js)
            ↓
Queries Firestore for matching entries (background.js)
            ↓
1 match  β†’  Auto-fills silently + shows toast
N matches β†’  Shows picker popup to select which credential

πŸ“ Project Structure

lockora/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ pages/
β”‚   β”‚   β”œβ”€β”€ SignIn.jsx
β”‚   β”‚   β”œβ”€β”€ SignUp.jsx
β”‚   β”‚   β”œβ”€β”€ UnlockVault.jsx
β”‚   β”‚   β”œβ”€β”€ Dashboard.jsx
β”‚   β”‚   └── SharePage.jsx
β”‚   β”œβ”€β”€ components/
β”‚   β”‚   └── dashboard/
β”‚   β”‚       β”œβ”€β”€ Sidebar.jsx
β”‚   β”‚       β”œβ”€β”€ VaultCard.jsx
β”‚   β”‚       β”œβ”€β”€ VaultModal.jsx
β”‚   β”‚       β”œβ”€β”€ PasswordGenerator.jsx
β”‚   β”‚       β”œβ”€β”€ SecurityCenter.jsx
β”‚   β”‚       β”œβ”€β”€ ShareModal.jsx
β”‚   β”‚       β”œβ”€β”€ AccountSettings.jsx
β”‚   β”‚       β”œβ”€β”€ SecuritySettings.jsx
β”‚   β”‚       └── Icons.jsx
β”‚   β”œβ”€β”€ utils/
β”‚   β”‚   β”œβ”€β”€ crypto.js          ← AES-256-GCM + PBKDF2
β”‚   β”‚   β”œβ”€β”€ breach.js          ← HaveIBeenPwned k-anonymity
β”‚   β”‚   └── vault.js           ← Shared helpers
β”‚   β”œβ”€β”€ constants/
β”‚   β”‚   └── vault.js           ← VAULT_TYPES, FIELDS definitions
β”‚   └── firebase.js
β”œβ”€β”€ lockora-extension/
β”‚   β”œβ”€β”€ manifest.json
β”‚   β”œβ”€β”€ background.js
β”‚   β”œβ”€β”€ content.js
β”‚   β”œβ”€β”€ firebase-config.js
β”‚   └── popup/
β”‚       β”œβ”€β”€ popup.html
β”‚       β”œβ”€β”€ popup.js
β”‚       └── popup.css
└── public/

πŸ”’ Security Model

Layer Implementation
Key derivation PBKDF2-SHA256, 600,000 iterations, UID as salt
Encryption AES-256-GCM with random IV per entry
Master password Never stored, never transmitted β€” derived to key in browser only
Canary verification Encrypted known value used to verify master password without storing it
Breach detection k-anonymity β€” only first 5 chars of SHA-1 hash sent to HIBP API
Firebase rules Per-user Firestore rules β€” no cross-user data access possible

πŸ—ΊοΈ Roadmap


🀝 Contributing

Contributions are welcome. Please open an issue first to discuss what you’d like to change.

# Fork the repo, then:
git checkout -b feature/your-feature
git commit -m "feat: add your feature"
git push origin feature/your-feature
# Open a Pull Request

πŸ“„ License

Distributed under the MIT License. See LICENSE for details.


Built with ❀️ using React, Firebase, and the Web Crypto API **[Live website](https://lockyt.vercel.app)**