|
| 1 | +# WhipHash - Secure Password Generator |
| 2 | + |
| 3 | +**Built with Pure High Pyth Entropy** |
| 4 | + |
| 5 | +A decentralized password generator that creates cryptographically secure passwords using high-entropy randomness from the Pyth Network, combined with advanced client-side encryption and secure storage in NilDB. |
| 6 | + |
| 7 | +## 🔗 Contract Explorer & Transaction Details |
| 8 | + |
| 9 | +**📊 Transaction Explorer**: [View on BaseScan](https://sepolia.basescan.org/address/0xE861DC68Eb976da0661035bBf132d6F3a3288B71) |
| 10 | + |
| 11 | +**💰 Pyth Network Fee**: **0.00000015 ETH** (constant throughout the project) |
| 12 | +- **Cost Efficiency**: Ultra-low fees for high-entropy randomness |
| 13 | + |
| 14 | +## 📋 Deployed Contracts |
| 15 | + |
| 16 | +### Base Sepolia Testnet |
| 17 | + |
| 18 | +| Contract | Address | Purpose | |
| 19 | +|----------|---------|---------| |
| 20 | +| **RandomnessGen** | `0xE861DC68Eb976da0661035bBf132d6F3a3288B71` | Generates random number pairs using Pyth Network entropy | |
| 21 | +| **Entropy** | `0x41c9e39574F40Ad34c79f1C99B66A45eFB830d4c` | Pyth Network entropy provider contract | |
| 22 | + |
| 23 | +### Contract Details |
| 24 | +- **Network**: Base Sepolia Testnet (Chain ID: 84532) |
| 25 | +- **Deployment Hash**: `0x39a943edca709c3337e2b01e6b58cf9db16af0b6403acb48448f7094b9354bb1` |
| 26 | +- **Block**: 32774035 |
| 27 | +- **Gas Used**: 1,857,888 gas |
| 28 | +- **Cost**: 0.000001858038488928 ETH |
| 29 | +- **Status**: ✅ Verified on Sourcify |
| 30 | + |
| 31 | +## 🏗️ Architecture Overview |
| 32 | + |
| 33 | +### Client-Side Password Generation |
| 34 | +- **Pure Client-Side**: All password generation happens in the browser using Web Crypto API |
| 35 | +- **No Server Dependency**: Passwords are never transmitted to servers in plaintext |
| 36 | +- **Device Secrets**: Generated locally using `crypto.getRandomValues()` |
| 37 | + |
| 38 | +### Server-Side Storage |
| 39 | +- **Encrypted Storage**: Passwords are encrypted before being sent to NilDB |
| 40 | +- **NilDB Integration**: Decentralized database for secure password storage |
| 41 | +- **Metadata Preservation**: Transaction hashes and sequence numbers stored for verification |
| 42 | + |
| 43 | +## 🔒 Encryption & Security Implementation |
| 44 | + |
| 45 | +### Multi-Layer Cryptographic Process |
| 46 | + |
| 47 | +#### 1. **Device Secret Generation (C)** |
| 48 | +```javascript |
| 49 | +// Generate 32-byte device secret locally |
| 50 | +const deviceSecret = crypto.getRandomValues(new Uint8Array(32)) |
| 51 | +``` |
| 52 | +- **Purpose**: Local entropy source that never leaves the device |
| 53 | +- **Storage**: Kept in memory only, never transmitted |
| 54 | + |
| 55 | +#### 2. **On-Chain Randomness (R1, R2)** |
| 56 | +```solidity |
| 57 | +// Pyth Network provides two random numbers |
| 58 | +uint256 n1; // First random number (R1) |
| 59 | +uint256 n2; // Second random number (R2) |
| 60 | +``` |
| 61 | +- **Source**: Pyth Network's high-entropy randomness |
| 62 | +- **Verification**: Blockchain transaction provides cryptographic proof |
| 63 | +- **Advantage**: Unpredictable, verifiable, and tamper-proof |
| 64 | + |
| 65 | +#### 3. **HKDF Key Derivation** |
| 66 | +```javascript |
| 67 | +// Mix R1 + C → local_raw using HKDF-SHA256 |
| 68 | +const localRaw = await hkdf(ikm, 32, appSalt1, 'local_raw_v1') |
| 69 | +``` |
| 70 | +- **Algorithm**: HKDF-SHA256 (RFC 5869) |
| 71 | +- **Purpose**: Combines on-chain and device entropy |
| 72 | +- **Security**: Normalizes inputs and provides uniform seed |
| 73 | + |
| 74 | +#### 4. **Memory-Hard Key Derivation** |
| 75 | +```javascript |
| 76 | +// Harden local_raw → LocalKey using Argon2id/scrypt |
| 77 | +const localKey = await argon2id(localRaw, salt1, params, 32) |
| 78 | +``` |
| 79 | +- **Algorithm**: Argon2id/scrypt (memory-hard) |
| 80 | +- **Parameters**: 64MB memory, 3 iterations, 4 parallelism |
| 81 | +- **Purpose**: Defends against offline brute force attacks |
| 82 | + |
| 83 | +#### 5. **Final Password Derivation** |
| 84 | +```javascript |
| 85 | +// Derive final password using LocalKey + R2 |
| 86 | +const passwordBytes = await argon2id(seedRaw, passwordSalt, params, 32) |
| 87 | +``` |
| 88 | +- **Process**: HKDF + Argon2id for final hardening |
| 89 | +- **Output**: 32-byte password material |
| 90 | +- **Character Set**: Letters, numbers, symbols (94 characters) |
| 91 | + |
| 92 | +### Security Advantages |
| 93 | + |
| 94 | +#### **Pyth Network Entropy Benefits:** |
| 95 | +1. **True Randomness**: Pyth provides cryptographically secure random numbers |
| 96 | +2. **Verifiable**: Blockchain transactions provide proof of randomness |
| 97 | +3. **Tamper-Proof**: Immutable blockchain prevents manipulation |
| 98 | +4. **High Entropy**: Superior to pseudo-random number generators |
| 99 | +5. **Decentralized**: No single point of failure or control |
| 100 | + |
| 101 | +#### **Multi-Layer Protection:** |
| 102 | +- **Device Secret**: Local entropy prevents server-side attacks |
| 103 | +- **On-Chain Proof**: Blockchain provides verifiable randomness |
| 104 | +- **Memory Hardening**: Argon2id prevents GPU/ASIC attacks |
| 105 | +- **HKDF Mixing**: Combines multiple entropy sources securely |
| 106 | + |
| 107 | +## 🚀 How to Run the Project |
| 108 | + |
| 109 | +### Prerequisites |
| 110 | +- Node.js 18+ |
| 111 | +- npm or yarn |
| 112 | +- MetaMask wallet (for blockchain interaction) |
| 113 | +- Git |
| 114 | + |
| 115 | +### 1. Clone the Repository |
| 116 | +```bash |
| 117 | +git clone <repository-url> |
| 118 | +cd whiphash |
| 119 | +``` |
| 120 | + |
| 121 | +### 2. Install Dependencies |
| 122 | +```bash |
| 123 | +npm install |
| 124 | +``` |
| 125 | + |
| 126 | +### 3. Environment Setup |
| 127 | +```bash |
| 128 | +cp .env.example .env.local |
| 129 | +``` |
| 130 | + |
| 131 | +#### Required Environment Variables |
| 132 | +```env |
| 133 | +# NilDB Configuration |
| 134 | +NILLION_API_KEY=your-nillion-api-key |
| 135 | +NILLION_COLLECTION_ID=your-collection-id |
| 136 | +
|
| 137 | +# Alternative NilDB Configuration (if using different setup) |
| 138 | +NILCHAIN_URL=http://rpc.testnet.nilchain-rpc-proxy.nilogy.xyz |
| 139 | +NILAUTH_URL=https://nilauth.sandbox.app-cluster.sandbox.nilogy.xyz |
| 140 | +NILDB_NODES=https://nildb-stg-n1.nillion.network,https://nildb-stg-n2.nillion.network,https://nildb-stg-n3.nillion.network |
| 141 | +BUILDER_PRIVATE_KEY=your-builder-private-key |
| 142 | +``` |
| 143 | + |
| 144 | +### 4. Start the Development Server |
| 145 | +```bash |
| 146 | +npm run dev |
| 147 | +``` |
| 148 | + |
| 149 | +The app will be available at `http://localhost:3000` |
| 150 | + |
| 151 | +### 5. Browser Extension (Optional) |
| 152 | + |
| 153 | +#### Install the Extension |
| 154 | +1. Open Chrome and go to `chrome://extensions/` |
| 155 | +2. Enable "Developer mode" |
| 156 | +3. Click "Load unpacked" |
| 157 | +4. Select the `demo-extension` folder |
| 158 | +5. Pin the extension for easy access |
| 159 | + |
| 160 | +#### Extension Features |
| 161 | +- **🖼️ Embedded Mode**: View app within extension popup |
| 162 | +- **⛶ Fullscreen Mode**: Open app in new tab |
| 163 | +- **🔗 Wallet Mode**: Optimized for wallet interactions |
| 164 | + |
| 165 | +### 6. Usage Instructions |
| 166 | + |
| 167 | +#### Generate a Password |
| 168 | +1. **Connect Wallet**: Click "Connect Wallet" and approve MetaMask |
| 169 | +2. **Request Randomness**: Click "Generate Secure Password" |
| 170 | +3. **Wait for Pyth**: System fetches randomness from Pyth Network |
| 171 | +4. **Password Generated**: Secure password appears with copy option |
| 172 | +5. **Store Password**: Enter socials and save to NilDB |
| 173 | + |
| 174 | +#### View Saved Passwords |
| 175 | +1. Navigate to `/view` or click "View Saved Passwords →" |
| 176 | +2. See all stored passwords with metadata |
| 177 | +3. Click to show/hide passwords |
| 178 | +4. Copy passwords to clipboard |
| 179 | + |
| 180 | +## 🛠️ Development |
| 181 | + |
| 182 | +### Project Structure |
| 183 | +``` |
| 184 | +whiphash/ |
| 185 | +├── app/ # App router pages |
| 186 | +│ ├── page.tsx # Landing page |
| 187 | +│ ├── test/page.tsx # Password generation |
| 188 | +│ ├── view/page.tsx # Password viewing |
| 189 | +│ └── api/nildb/ # NilDB API routes |
| 190 | +├── components/ # React components |
| 191 | +├── lib/ # Utility functions |
| 192 | +└── demo-extension/ # Browser extension |
| 193 | +``` |
| 194 | + |
| 195 | +### Key Technologies |
| 196 | +- **Frontend**: Next.js 16, React 19, TypeScript, Tailwind CSS |
| 197 | +- **Blockchain**: Viem, Ethers.js, Base Sepolia |
| 198 | +- **Randomness**: Pyth Network, Entropy Protocol |
| 199 | +- **Storage**: NilDB (Nillion Network) |
| 200 | +- **Crypto**: Web Crypto API, HKDF, Argon2id/scrypt |
| 201 | +- **UI**: Three.js, GSAP, Custom animations |
| 202 | + |
| 203 | +### API Endpoints |
| 204 | +- `POST /api/nildb/store-password` - Store encrypted password |
| 205 | +- `GET /api/nildb/read-collection` - Retrieve stored passwords |
| 206 | +- `GET /api/nildb/test-config` - Test NilDB configuration |
| 207 | + |
| 208 | +## 🔐 Security Considerations |
| 209 | + |
| 210 | +### What's Encrypted |
| 211 | +- ✅ Passwords (client-side generation) |
| 212 | +- ✅ Device secrets (never transmitted) |
| 213 | +- ✅ Storage in NilDB (encrypted at rest) |
| 214 | +- ✅ All sensitive data (socials, metadata) |
| 215 | + |
| 216 | +### What's Public |
| 217 | +- ✅ Transaction hashes (for verification) |
| 218 | +- ✅ Sequence numbers (for randomness proof) |
| 219 | +- ✅ Blockchain randomness (verifiable on-chain) |
| 220 | + |
| 221 | +### Best Practices |
| 222 | +- **Never share device secrets** |
| 223 | +- **Verify transaction hashes** |
| 224 | +- **Use strong master passwords** |
| 225 | +- **Regular security audits** |
| 226 | + |
| 227 | +## 📊 Performance |
| 228 | + |
| 229 | +### Password Generation Time |
| 230 | +- **Device Secret**: ~1ms (local generation) |
| 231 | +- **Blockchain Call**: ~2-5s (Pyth Network) |
| 232 | +- **HKDF Processing**: ~10ms |
| 233 | +- **Argon2id**: ~100-500ms (memory-hard) |
| 234 | +- **Total**: ~3-6 seconds per password |
| 235 | + |
| 236 | +### Storage Efficiency |
| 237 | +- **Password**: 16-32 characters |
| 238 | +- **Metadata**: ~1KB per entry |
| 239 | +- **NilDB**: Decentralized, redundant storage |
| 240 | + |
| 241 | +## 🤝 Contributing |
| 242 | + |
| 243 | +1. Fork the repository |
| 244 | +2. Create a feature branch |
| 245 | +3. Make your changes |
| 246 | +4. Test thoroughly |
| 247 | +5. Submit a pull request |
| 248 | + |
| 249 | +## 📄 License |
| 250 | + |
| 251 | +This project is licensed under the MIT License - see the LICENSE file for details. |
| 252 | + |
| 253 | +## 🙏 Acknowledgments |
| 254 | + |
| 255 | +- **Pyth Network** for providing high-entropy randomness |
| 256 | +- **Nillion Network** for decentralized storage |
| 257 | +- **Base Network** for fast, low-cost transactions |
| 258 | +- **MetaMask** for wallet integration |
| 259 | +- **Next.js** for the React framework |
| 260 | + |
| 261 | +## 🔗 Links |
| 262 | + |
| 263 | +- **Live Demo**: [ETHGlobal Showcase](https://ethglobal.com/showcase/whiphash-9u5xj) |
| 264 | +- **GitHub Repository**: [dumprahul/whiphash](https://github.com/dumprahul/whiphash) |
| 265 | +- **Contract Explorer**: [BaseScan](https://sepolia.basescan.org/address/0xE861DC68Eb976da0661035bBf132d6F3a3288B71) |
| 266 | + |
| 267 | +--- |
| 268 | + |
| 269 | +**Built with ❤️ and pure high Pyth entropy** |
0 commit comments