document encryption enforcement options

This commit is contained in:
Username
2025-12-20 17:46:58 +01:00
parent b7f247d148
commit cdf8de5a8b

View File

@@ -220,10 +220,12 @@ Password protected content
**Size Limits:** **Size Limits:**
- Minimum: disabled by default (`FLASKPASTE_MIN_SIZE`, e.g. 64 bytes for encryption enforcement) - Minimum: disabled by default (`FLASKPASTE_MIN_SIZE`, e.g. 64 bytes for encryption enforcement)
- Anonymous: 3 MiB (configurable via `FLASKPASTE_MAX_ANON`)
- Authenticated: 50 MiB (configurable via `FLASKPASTE_MAX_AUTH`) - Authenticated: 50 MiB (configurable via `FLASKPASTE_MAX_AUTH`)
--- ---
### GET /{id}
### HEAD /{id} ### HEAD /{id}
@@ -575,6 +577,50 @@ export FLASKPASTE_MIN_ENTROPY_SIZE=256 # Only check content >= this size (defaul
**How it works:** **How it works:**
- Content is checked for magic bytes (PNG, JPEG, PDF, ZIP, etc.) - Content is checked for magic bytes (PNG, JPEG, PDF, ZIP, etc.)
- Content is checked for valid UTF-8 text - Content is checked for valid UTF-8 text
- Recognized formats are rejected with 400
- Only application/octet-stream (unrecognizable binary) is allowed
**Configuration:**
```bash
export FLASKPASTE_REQUIRE_BINARY=1 # Reject recognizable formats (0=disabled)
```
**Response (400 Bad Request):**
```json
{
"error": "Recognizable format not allowed",
"detected": "text/plain",
"hint": "Encrypt content before uploading (-e flag in fpaste)"
}
```
**Detected formats:**
- `text/plain` (valid UTF-8 text)
- `image/png`, `image/jpeg`, `image/gif`, `image/webp`
- `application/pdf`, `application/zip`, `application/gzip`
**vs Entropy enforcement:**
| Method | Detects | False positives |
|--------|---------|-----------------|
| Entropy | Random-looking data | Compressed files pass |
| Binary | No magic bytes + invalid UTF-8 | Minimal |
Use both together for maximum encryption enforcement:
```bash
export FLASKPASTE_REQUIRE_BINARY=1
export FLASKPASTE_MIN_ENTROPY=6.0
export FLASKPASTE_MIN_SIZE=64
```
---
## Proof-of-Work
FlaskPaste includes an optional proof-of-work system to prevent automated spam.
**How it works:**
1. Client requests a challenge via `GET /challenge`
2. Server returns a nonce, difficulty, expiry time, and signed token
3. Client computes SHA256 hashes until finding one with enough leading zero bits 3. Client computes SHA256 hashes until finding one with enough leading zero bits
4. Client submits paste with `X-PoW-Token` and `X-PoW-Solution` headers 4. Client submits paste with `X-PoW-Token` and `X-PoW-Solution` headers