Repository navigation
Releases: viyh/whisper
Releases · viyh/whisper
Release list
0.2.0
[0.2.0] - 2026-04-11
- Argon2id password hashing - Replaced bcrypt (server-side) and PBKDF2 (client-side) with Argon2id for both. Argon2id is memory-hard and resistant to GPU/ASIC brute-force attacks.
- AES-256-GCM encryption - Replaced CryptoJS AES-CBC with Web Crypto API AES-256-GCM (authenticated encryption). Eliminates padding oracle attack surface.
- Rate limiting - Added Flask-Limiter (10 requests/minute per IP) on the secret retrieval endpoint to prevent brute-force attacks.
- Per-secret lockout - Secrets lock after 10 failed password attempts.
- One-time secret race condition fix - Atomic claim pattern prevents concurrent requests from both retrieving a one-time secret. Uses file rename (local), dict lock (memory), head+delete (S3), and generation-match delete (GCS).
- Security headers - Added Content-Security-Policy, X-Frame-Options (DENY), X-Content-Type-Options (nosniff), Referrer-Policy (no-referrer), and Permissions-Policy via nginx.
- Strict CSP - No
'unsafe-inline'inscript-src. All inline scripts and event handlers moved to external JS files. All third-party scripts consolidated to a single CDN (jsdelivr). Inline styles replaced with thehiddenHTML attribute where possible. - Input validation - All POST endpoints validate JSON fields, types, and allowed values. Returns 400 on invalid input. Unsupported version values are strictly rejected (400).
- ProxyFix hardened - Changed from
x_host=1tox_for=1, x_proto=1, x_host=0to prevent host header injection. - Nginx body size - Reduced
client_max_body_sizefrom 1G to 2m to match application limits. - Config key warning - Startup warning if
secret_keyappears to be a default or is too short. - PBKDF2 iteration count - Increased client-side PBKDF2-SHA256 key derivation from 210,000 to 600,000 iterations per OWASP recommendations.
- Modulo bias fix - Random password generation now uses rejection sampling to eliminate bias.
- Password visibility toggle - Password fields default to hidden (
type="password") with eye icon toggle on both create and retrieve pages. - HSTS enabled by default in nginx config (2-year max-age, includeSubDomains, preload).
- Flask debug mode decoupled from LOG_LEVEL to prevent accidental Werkzeug debugger exposure in containers.
0.1.0
Complete rewrite of the code. Implemented pluggable storage backends, simplified crypto process, updated all dependencies, and made everything much more user friendly. Added lots of documentation.
Added
- Complete rewrite for pluggable storage backends
- Add storage backends: S3, GCS, local, memory
- Add file sharing support
- Add size limit for files
- Support web URL sub paths
Changed
- Storage cleaner runs periodically in background
- Better logging and debugging
- Run as unprivileged user
- Use SHA256 hashes for item paths
- Upgrade to python 3.10
- Upgrade JS libs: jquery@3.6.0, bootstrap@5.0.2, clipboard.js@2.0.10, crypto-js@4.1.1
- Use CDN JS libs
- Use config files for configuration
- Update look and feel for Bootstrap 5
- Improved user flow (such as focus on load, clipboard buttons, order of fields, etc.)
- Generate random password by default
- Better config parsing. Check for default config parameters or extra keys.
- Updated documentation: README, in-line code
Removed
- DynamoDB support/dependency. DynamoDB stores a max of 400 kB items, so unfeasible for backend with new file support.
Fixed
- Fix grid support for mobile responsiveness (PR #4), by @kdeenanauth
Security
- Use PBKDF2 (salted SHA512, 10000 rounds) for client-side password hashing
- Use bcrypt for server-side password hashing
- Simplify crypto