Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/AndrewPaglusch/FlashPaper
One-time encrypted password/secret sharing
https://github.com/AndrewPaglusch/FlashPaper
aes aes-256 bcrypt ciphertext destruct destructing disposable encryption message one-time one-time-secret password php private secret security sqlite webapp zero-knowledge
Last synced: 3 months ago
JSON representation
One-time encrypted password/secret sharing
- Host: GitHub
- URL: https://github.com/AndrewPaglusch/FlashPaper
- Owner: AndrewPaglusch
- License: mit
- Created: 2017-05-12T00:33:45.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2024-07-22T23:29:26.000Z (6 months ago)
- Last Synced: 2024-08-01T19:54:14.687Z (6 months ago)
- Topics: aes, aes-256, bcrypt, ciphertext, destruct, destructing, disposable, encryption, message, one-time, one-time-secret, password, php, private, secret, security, sqlite, webapp, zero-knowledge
- Language: PHP
- Homepage:
- Size: 613 KB
- Stars: 362
- Watchers: 5
- Forks: 58
- Open Issues: 9
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Security: SECURITY.md
Awesome Lists containing this project
README
# FlashPaper
A one-time encrypted zero-knowledge password/secret sharing application focused on simplicity and security. No database or complicated set-up required.[![Docker](https://github.com/AndrewPaglusch/FlashPaper/actions/workflows/docker_publish.yml/badge.svg)](https://github.com/AndrewPaglusch/FlashPaper/actions/workflows/docker_publish.yml)
## Demo
https://flashpaper.io
![Picture of Main Page](https://i.imgur.com/KIs9fjE.png)
## Installation
### Docker *(Recommended)*
The latest release of FlashPaper is available at [`ghcr.io/andrewpaglusch/flashpaper`](https://ghcr.io/andrewpaglusch/flashpaper).
1. Download [docker-compose.yml](https://raw.githubusercontent.com/AndrewPaglusch/FlashPaper/master/docker-compose.yml) from this repo
2. Edit `docker-compose.yml` with your customizations
3. Run `docker-compose up -d` to start FlashPaper
4. Set up a reverse-proxy in front of FlashPaper that terminates SSL/TLS#### Building an Image
You can build your own image using the provided Dockerfile in the `docker/` folder.In order to build FlashPaper, run `docker build . -t flashpaper -f docker/Dockerfile`. If you would like to build FlashPaper for a different CPU architecture, replace `docker/Dockerfile` with the appropriate Dockerfile.
You can also build via docker-compose by replacing the `image:` line in [docker-compose.yml](https://github.com/AndrewPaglusch/FlashPaper/blob/master/docker-compose.yml) with the following (make sure to choose the Dockerfile for your architecture):
```
build:
context: .
dockerfile: docker/Dockerfile
```### Traditional
**Requirements:** PHP 7.0+ and a web server
1. Download and extract the [latest release](https://github.com/AndrewPaglusch/FlashPaper/releases/latest) of FlashPaper to the document root of your web server
2. Copy `settings.example.php` to `settings.php` and make customizations to that file
3. Disable access logging in your web server's configuration so nothing sensitive (IP addresses, user agent strings, timestamps, etc) are logged to disk## How It Works
### Submitting Secret
1. `--secrets.sqlite` sqlite database created (if it doesn't already exist)
2. `--aes-static.key` randomized 256-bit AES static key created (if one doesn't exist already)
3. Random 256-bit AES key created
4. Random 128-bit IV created
5. Random 64-bit ID created
6. ID + AES key hashed with bcrypt
7. Submitted text encrypted with AES-256-CBC using AES key and random IV
8. Ciphertext now encrypted with AES-256-CBC using static AES key and random IV
9. ID and AES key joined (known as `k`)
10. Random prune date/time generated using `prune`->`min_days`/`max_days`
11. ID, IV, bcrypt hash, ciphertext, and prune epoch stored in DB
12. `k` value returned to user in one-time URL### Retrieving Secret
1. `k` value removed from URL
2. `k` value split into two parts: ID and AES key
3. IV, bcrypt hash, ciphertext looked up in DB with ID from `k`
4. `k` bcrypt hash compared against bcrypt hash from DB (prevents tampering of URL)
5. Ciphertext decrypted with static AES key and IV
6. Ciphertext decrypted with AES key from `k` and IV
7. Entry deleted from DB
8. Decrypted text sent to user## Submitting Secrets via the API (with `curl`)
FlashPaper can accept secret submissions through a simple API. The retrieval URL will be returned in a JSON object.
Here's what it looks like to submit a secret with `curl`:
```
$ curl -s -X POST -d "secret=my secret&json=true" https://flashpaper.io
{"url":"https://flashpaper.io/?k=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
```## Settings
### `prune`:
- `enabled`: Turn on/off auto-pruning of old secrets from the database upon page load
- `min_days`/`max_days`: When a secret is submitted, a random date/time is generated between `min_days` and `max_days` in the future. After that date/time has elapsed, the secret will be pruned from the database if `enabled` is set to `true`. This is to prevent your database from being filled with secrets that are never retrieved. NOTE: Even if `enabled` is set to `false`, the prune value will still be generated and stored in the database, but secrets will not be pruned unless `enabled` is switched to `true`.### `base_url`:
FlashPaper will try to generate the secret retrieval URL based on information provided by the upstream webserver. This process isn't always 100% accurate. If the secret retrieval URL that FlashPaper creates isn't correct for your setup (this usually happens when you're using a reverse proxy upstream), you can manually specify the URL that FlashPaper will use. For example: A `base_url` of "https://foo.com/flashpaper" will result in retrieval URLs like "https://foo.com/flashpaper/?k=xxxxxxxxxxxxx".### `display_logo`:
- `true`: The logo set in `site_logo` (either a file path or a URL) will be displayed at the top of the page. If `site_logo` isn't set, the default FlashPaper logo at `img/logo.png` will be displayed
- `false`: No logo will be displayed on your FlashPaper instance### `display_title`:
- `true`: The setting `site_title` will be displayed at the top of the page. If `display_logo` is enabled, the text will appear to the right of the logo.
- `false`: The setting `site_title` will not be displayed.## Donations
PayPal: https://paypal.me/AndrewPaglusch
BitCoin: 1EYDa33S14ejuQGMhSjtBUmBHTBB8mbTRs
Donations are not expected, but they are very appreciated!