Deterministic Ed25519 SSH key generation from a seed passphrase, via configurable KDF and salt-hash backends.
Project description
detssh
Deterministic Ed25519 SSH key generation from a seed passphrase. Same passphrase + same parameters → same keypair, every time, on any machine - nothing to back up but what's in your head.
detssh
Prompts for everything (passphrase hidden + confirmed) and writes to the
same place ssh-keygen would: ~/.ssh/id_ed25519 / ~/.ssh/id_ed25519.pub
(mode 600/700, ~/.ssh created if missing). Pass --output to write
somewhere else instead.
Non-interactively:
detssh --kdf argon2id --salt-algo blake2b --seed "..." --label github --overwrite-files
Any flag switches to non-interactive mode: missing optional fields fall back
to their defaults, --seed is the only required one. Passing --seed on the
command line puts it in your shell history and process list (ps aux) - fine
for local scripting, but prefer the interactive prompt when that matters.
Backends
--kdf:argon2id(default),argon2i,argon2d,scrypt,pbkdf2,bcrypt_pbkdf--salt-algo:blake2b(default),blake2s,sha256,sha384,sha512,sha3_256,sha3_384,sha3_512
Each combination has its own options (cost knobs, salt digest size, etc.),
with their valid ranges shown in both --help and the interactive prompts.
See them with:
detssh --kdf <kdf> --salt-algo <salt-algo> --help
We recommend sticking with the defaults (argon2id, memory-hard with a high
cost) unless you have a specific reason not to - they make brute-forcing your
passphrase significantly more expensive than faster KDFs like pbkdf2.
Cost knobs (iterations, memory, cost, rounds, ...) also carry a soft safety
limit meant to catch typos before they cost you minutes of derivation time.
In interactive mode, going over one doesn't interrupt you - everything you
exceeded is summarized in one confirmation at the very end. In flag mode, it
fails immediately unless you pass --force-allow-soft-constraints.
Determinism guarantee
Same explicit parameters → same key, across any release sharing the same
major version - only a major version bump may change key derivation. That
guarantee starts at 1.0; we're still on 0.x, so it doesn't apply yet (see
tests/golden/README.md).
Development
uv sync
uv run pytest
uv run ruff check .
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file detssh-0.1.0.tar.gz.
File metadata
- Download URL: detssh-0.1.0.tar.gz
- Upload date:
- Size: 63.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b1a5ad94dd3ae82e9fdd20b207904354130769865a9b7d60e651c0291fc3bbd3
|
|
| MD5 |
1df60fb0a485b9a9011d5a0116768f82
|
|
| BLAKE2b-256 |
eb7b14126b4d699a52490da8dac0c35f0102ec2ce077818ca290c07233a04295
|
Provenance
The following attestation bundles were made for detssh-0.1.0.tar.gz:
Publisher:
publish.yml on isik-kaplan/detssh
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
detssh-0.1.0.tar.gz -
Subject digest:
b1a5ad94dd3ae82e9fdd20b207904354130769865a9b7d60e651c0291fc3bbd3 - Sigstore transparency entry: 2203280542
- Sigstore integration time:
-
Permalink:
isik-kaplan/detssh@8d55e0fe5e4c9a3c6866d708700ddd9d802b6d7d -
Branch / Tag:
refs/heads/master - Owner: https://github.com/isik-kaplan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8d55e0fe5e4c9a3c6866d708700ddd9d802b6d7d -
Trigger Event:
push
-
Statement type:
File details
Details for the file detssh-0.1.0-py3-none-any.whl.
File metadata
- Download URL: detssh-0.1.0-py3-none-any.whl
- Upload date:
- Size: 18.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ac6d859380b6bd25c30c3cba2a62b5d96a8be66932a8bd32e12788225f20a890
|
|
| MD5 |
fe6a57f763b502bcbad44c173d79b1c4
|
|
| BLAKE2b-256 |
20e6aa322a3052ac4fcc06e78176b2c42b00480ae3604f02231c598c8fbdab3a
|
Provenance
The following attestation bundles were made for detssh-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on isik-kaplan/detssh
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
detssh-0.1.0-py3-none-any.whl -
Subject digest:
ac6d859380b6bd25c30c3cba2a62b5d96a8be66932a8bd32e12788225f20a890 - Sigstore transparency entry: 2203280632
- Sigstore integration time:
-
Permalink:
isik-kaplan/detssh@8d55e0fe5e4c9a3c6866d708700ddd9d802b6d7d -
Branch / Tag:
refs/heads/master - Owner: https://github.com/isik-kaplan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8d55e0fe5e4c9a3c6866d708700ddd9d802b6d7d -
Trigger Event:
push
-
Statement type: