You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+34Lines changed: 34 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -238,6 +238,26 @@ key binding. Deleting or unlinking a keyed profile permanently deletes that
238
238
browser key. These keys are protected from export, but they are not hardware
239
239
keys: script running in the same browser origin could still request signatures.
240
240
241
+
### Why This SSH Architecture Matters
242
+
243
+
| Design choice | Practical advantage |
244
+
| --- | --- |
245
+
| Non-extractable browser-owned private key | Private key bytes do not cross the browser boundary or enter Python memory, configuration files, settings exports, or terminal payloads. |
246
+
| Explicit key creation and per-connection **Use key** control | A key exists only after the user opts in for a saved profile, and password or host-side authentication remains available when key use is off. |
247
+
| Typed, short-lived signing requests | Each request is bound to the initiating browser connection, terminal, profile, key, public-key fingerprint, and challenge hash. Expired, replayed, stale, or mismatched responses fail closed. |
248
+
| Exact host, port, and username binding | Editing a Quick Connect target cannot silently reuse a profile key for another SSH account or endpoint. |
249
+
| Standard OpenSSH Ed25519 public key | The remote host only needs the copied key in `authorized_keys`; it does not need StandTerm, a browser component, or an agent. |
250
+
| Separate settings and key stores | Profiles, history, and browser preferences remain portable while private keys and key identifiers stay local to the browser that created them. |
251
+
252
+
The signing path keeps authentication authority narrow. Paramiko passes an SSH
253
+
challenge to StandTerm's browser-key adapter. StandTerm emits a structured
254
+
request only to the browser connection that started that terminal. The browser
255
+
validates the active connection and exact profile binding before signing, then
256
+
returns a 64-byte Ed25519 signature. Python verifies that signature against the
257
+
profile's public key before returning it to Paramiko. A browser disconnect,
258
+
timeout, changed connection draft, or stale terminal start cancels the path
0 commit comments