# Hasher πŸ” A modern, high-performance hash search and generation tool powered by Elasticsearch and Next.js. Search for hash values to find their plaintext origins or generate hashes from any text input. ![Hasher Banner](https://img.shields.io/badge/Next.js-16.0-black?style=for-the-badge&logo=next.js) ![Elasticsearch](https://img.shields.io/badge/Elasticsearch-8.x-005571?style=for-the-badge&logo=elasticsearch) ![TypeScript](https://img.shields.io/badge/TypeScript-5.x-3178C6?style=for-the-badge&logo=typescript) ## ✨ Features - πŸ” **Hash Lookup**: Search for MD5, SHA1, SHA256, SHA512, and Bcrypt hashes - πŸ”‘ **Hash Generation**: Generate multiple hash types from plaintext - πŸ’Ύ **Auto-Indexing**: Automatically stores searched plaintext and hashes - πŸ“Š **Elasticsearch Backend**: Scalable storage with 10 shards for performance - πŸš€ **Bulk Indexing**: Import wordlists via command-line script - 🎨 **Modern UI**: Beautiful, responsive interface with real-time feedback - πŸ“‹ **Copy to Clipboard**: One-click copying of any hash value ## πŸ—οΈ Architecture ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Next.js β”‚ ← Modern React UI β”‚ Frontend β”‚ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ β”‚ ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ API β”‚ ← REST endpoints β”‚ Routes β”‚ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ β”‚ ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚Elasticsearchβ”‚ ← Distributed storage β”‚ 10 Shards β”‚ (localhost:9200) β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ## πŸš€ Quick Start ### Prerequisites - Node.js 18.x or higher - Elasticsearch 8.x running on `localhost:9200` - npm or yarn ### Installation 1. **Clone the repository** ```bash git clone cd hasher ``` 2. **Install dependencies** ```bash npm install ``` 3. **Configure Elasticsearch** (optional) By default, the app connects to `http://localhost:9200`. To change this: ```bash export ELASTICSEARCH_NODE=http://your-elasticsearch-host:9200 ``` 4. **Run the development server** ```bash npm run dev ``` 5. **Open your browser** Navigate to [http://localhost:3000](http://localhost:3000) ## πŸ“– Usage ### Web Interface 1. **Search for a Hash** - Enter any MD5, SHA1, SHA256, or SHA512 hash - Click search or press Enter - View the plaintext result if found in the database 2. **Generate Hashes** - Enter any plaintext string - Get instant hash values for all supported algorithms - Hashes are automatically saved for future lookups ### Bulk Indexing Script Index large wordlists or dictionaries: ```bash # Basic usage npm run index-file wordlist.txt # With custom batch size npm run index-file wordlist.txt -- --batch-size 500 # Show help npm run index-file -- --help ``` **Input file format**: One word/phrase per line ```text password admin 123456 qwerty ``` **Script features**: - βœ… Bulk indexing with configurable batch size - βœ… Progress indicator with percentage - βœ… Error handling and reporting - βœ… Performance metrics (docs/sec) - βœ… Automatic index refresh ## πŸ”Œ API Reference ### Search Endpoint **POST** `/api/search` Search for a hash or generate hashes from plaintext. **Request Body**: ```json { "query": "5f4dcc3b5aa765d61d8327deb882cf99" } ``` **Response (Hash Found)**: ```json { "found": true, "hashType": "md5", "hash": "5f4dcc3b5aa765d61d8327deb882cf99", "results": [{ "plaintext": "password", "hashes": { "md5": "5f4dcc3b5aa765d61d8327deb882cf99", "sha1": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8", "sha256": "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8", "sha512": "b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86" } }] } ``` **Response (Plaintext Input)**: ```json { "found": true, "isPlaintext": true, "plaintext": "password", "hashes": { "md5": "5f4dcc3b5aa765d61d8327deb882cf99", "sha1": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8", "sha256": "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8", "sha512": "b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86" } } ``` ### Health Check Endpoint **GET** `/api/health` Check Elasticsearch connection and index status. **Response**: ```json { "status": "ok", "elasticsearch": { "cluster": "elasticsearch", "status": "green" }, "index": { "exists": true, "name": "hasher", "stats": { "documentCount": 1542, "indexSize": 524288 } } } ``` ## πŸ—„οΈ Elasticsearch Index ### Index Configuration - **Name**: `hasher` - **Shards**: 10 (for horizontal scaling) - **Replicas**: 1 (for redundancy) ### Mapping Schema ```json { "plaintext": { "type": "text", "analyzer": "lowercase_analyzer", "fields": { "keyword": { "type": "keyword" } } }, "md5": { "type": "keyword" }, "sha1": { "type": "keyword" }, "sha256": { "type": "keyword" }, "sha512": { "type": "keyword" }, "created_at": { "type": "date" } } ``` ## πŸ“ Project Structure ``` hasher/ β”œβ”€β”€ app/ β”‚ β”œβ”€β”€ api/ β”‚ β”‚ β”œβ”€β”€ search/ β”‚ β”‚ β”‚ └── route.ts # Search endpoint β”‚ β”‚ └── health/ β”‚ β”‚ └── route.ts # Health check endpoint β”‚ β”œβ”€β”€ layout.tsx # Root layout β”‚ β”œβ”€β”€ page.tsx # Main UI component β”‚ └── globals.css # Global styles β”œβ”€β”€ lib/ β”‚ β”œβ”€β”€ elasticsearch.ts # ES client & index config β”‚ └── hash.ts # Hash utilities β”œβ”€β”€ scripts/ β”‚ └── index-file.ts # Bulk indexing script β”œβ”€β”€ package.json β”œβ”€β”€ tsconfig.json β”œβ”€β”€ next.config.ts └── README.md ``` ## πŸ› οΈ Development ### Build for Production ```bash npm run build npm run start ``` ### Environment Variables Create a `.env.local` file: ```env ELASTICSEARCH_NODE=http://localhost:9200 ``` ### Linting ```bash npm run lint ``` ## πŸ”’ Supported Hash Algorithms | Algorithm | Length (hex) | Detection Pattern | |-----------|--------------|-------------------| | MD5 | 32 | `^[a-f0-9]{32}$` | | SHA1 | 40 | `^[a-f0-9]{40}$` | | SHA256 | 64 | `^[a-f0-9]{64}$` | | SHA512 | 128 | `^[a-f0-9]{128}$` | | Bcrypt | 60 | `^\$2[abxy]\$` | ## πŸš€ Performance - **Bulk Indexing**: ~1000-5000 docs/sec (depending on hardware) - **Search Latency**: <50ms (typical) - **Horizontal Scaling**: 10 shards for parallel processing - **Auto-refresh**: Instant search availability for new documents ## 🀝 Contributing Contributions are welcome! Please feel free to submit a Pull Request. 1. Fork the repository 2. Create your feature branch (`git checkout -b feature/AmazingFeature`) 3. Commit your changes (`git commit -m 'Add some AmazingFeature'`) 4. Push to the branch (`git push origin feature/AmazingFeature`) 5. Open a Pull Request ## πŸ“ License This project is open source and available under the [MIT License](LICENSE). ## πŸ™ Acknowledgments - Built with [Next.js](https://nextjs.org/) - Powered by [Elasticsearch](https://www.elastic.co/) - Icons by [Lucide](https://lucide.dev/) - Styled with [Tailwind CSS](https://tailwindcss.com/) ## πŸ“§ Support For issues, questions, or contributions, please open an issue on GitHub. --- **Made with ❀️ for the security and development community**