Hasher 🔐
A modern, high-performance hash search and generation tool powered by Redis and Next.js. Search for hash values to find their plaintext origins or generate hashes from any text input.
✨ Features
- 🔍 Hash Lookup: Search for MD5, SHA1, SHA256, and SHA512 hashes
- 🔑 Hash Generation: Generate multiple hash types from plaintext
- 💾 Auto-Indexing: Automatically stores searched plaintext and hashes
- 📊 Redis Backend: Ultra-fast in-memory storage with persistence
- 🚀 Bulk Indexing: Import wordlists via command-line script with resume capability
- 🎨 Modern UI: Beautiful, responsive interface with real-time feedback
- 📋 Copy to Clipboard: One-click copying of any hash value
- ⚡ High Performance: Lightning-fast searches with Redis indexing
🏗️ Architecture
┌─────────────┐
│ Next.js │ ← Modern React UI
│ Frontend │
└──────┬──────┘
│
↓
┌─────────────┐
│ API │ ← REST endpoints
│ Routes │
└──────┬──────┘
│
↓
┌─────────────┐
│ Redis │ ← In-memory storage
│ (Key-Value │ (localhost:6379)
│ + Hashes) │
└─────────────┘
🚀 Quick Start
Prerequisites
- Node.js 18.x or higher
- Redis 6.x or higher running on
localhost:6379 - npm or yarn
Installation
-
Clone the repository
git clone <repository-url> cd hasher -
Install dependencies
npm install -
Start Redis (if not already running)
# Using Docker docker run -d --name redis -p 6379:6379 redis:latest # Or using system package manager sudo systemctl start redis -
Configure Redis (optional)
By default, the app connects to
localhost:6379. To change this:export REDIS_HOST=your-redis-host export REDIS_PORT=6379 export REDIS_PASSWORD=your-password # if authentication is enabled export REDIS_DB=0 # database number -
Run the development server
npm run dev -
Open your browser
Navigate to http://localhost:3000
📖 Usage
Web Interface
-
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
-
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:
# Basic usage
npm run index-file wordlist.txt
# With custom batch size
npm run index-file wordlist.txt -- --batch-size 500
# Skip duplicate checking (faster)
npm run index-file wordlist.txt -- --no-check
# Resume interrupted indexing
npm run index-file wordlist.txt -- --resume
# Show help
npm run index-file -- --help
Input file format: One word/phrase per line
password
admin
123456
qwerty
Script features:
- ✅ Bulk indexing with configurable batch size
- ✅ Progress indicator and real-time stats
- ✅ State persistence with resume capability
- ✅ Optional duplicate checking
- ✅ Error handling and reporting
- ✅ Performance metrics (docs/sec)
🔌 API Reference
Search Endpoint
POST /api/search
Search for a hash or generate hashes from plaintext.
Request Body:
{
"query": "5f4dcc3b5aa765d61d8327deb882cf99"
}
Response (Hash Found):
{
"found": true,
"hashType": "md5",
"hash": "5f4dcc3b5aa765d61d8327deb882cf99",
"results": [{
"plaintext": "password",
"hashes": {
"md5": "5f4dcc3b5aa765d61d8327deb882cf99",
"sha1": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8",
"sha256": "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8",
"sha512": "b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86"
}
}]
}
Response (Plaintext Input):
{
"found": true,
"isPlaintext": true,
"plaintext": "password",
"hashes": {
"md5": "5f4dcc3b5aa765d61d8327deb882cf99",
"sha1": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8",
"sha256": "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8",
"sha512": "b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86"
}
}
Health Check Endpoint
GET /api/health
Check Redis connection and index status.
Response:
{
"status": "ok",
"redis": {
"connected": true,
"version": "7.0.15",
"usedMemory": 2097152,
"dbSize": 1542
},
"index": {
"exists": true,
"name": "hasher",
"stats": {
"documentCount": 1542,
"indexSize": 524288
}
}
}
🗄️ Redis Data Structure
Key Structure
Main Documents: hash:plaintext:{plaintext}
- Stores complete hash document as JSON string
- Contains all hash algorithms and metadata
Hash Indexes: hash:index:{algorithm}:{hash}
- Reverse lookup from hash to plaintext
- One key per algorithm (md5, sha1, sha256, sha512)
- Value is the plaintext string
Statistics: hash:stats (Redis Hash)
count: Total number of unique plaintextssize: Approximate total size in bytes
Document Schema
{
"plaintext": string,
"md5": string,
"sha1": string,
"sha256": string,
"sha512": string,
"created_at": string (ISO 8601)
}
📁 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/
│ ├── redis.ts # Redis client & data layer
│ └── hash.ts # Hash utilities
├── scripts/
│ ├── index-file.ts # Bulk indexing script
│ └── remove-duplicates.ts # Duplicate removal utility
├── package.json
├── tsconfig.json
├── next.config.ts
└── README.md
🛠️ Development
Build for Production
npm run build
npm run start
Environment Variables
Create a .env.local file:
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=your-password
REDIS_DB=0
Linting
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}$ |
🚀 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.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
📝 License
This project is open source and available under the MIT License.
🙏 Acknowledgments
- Built with Next.js
- Powered by Redis
- Icons by Lucide
- Styled with Tailwind CSS
📧 Support
For issues, questions, or contributions, please open an issue on GitHub.
Made with ❤️ for the security and development community