fix(auth): limits by address and network, so nobody holds an owner out
Anyone who knew an address could spend its whole hour: 10 sign-ins, 5 phrase proofs and 3 codes, each new code voiding the last (the second reading's M3). Now: - sign-ins begun count per address and network (10 an hour), phrase proofs likewise (5), and networks as before (30); - failed proofs count per address from every network: past 30 an hour (wrong passwords, phrases' signatures by another key, an address nobody has alike) no sign-in or proof begins for it anywhere, so guessing from many networks makes at most 30 guesses an hour, while holding an owner out takes failing without end from at least three; longer windows would outlive the hourly pruning of the limits' notes; - a signed-in change of password begins 10 times an hour per account; - codes by mail count per address and network (3 an hour), per address from every network (10, no mailbox flooded) and per network (10), and up to 3 are valid at once, a fourth voiding the oldest, so codes others ask for don't void the one its owner is typing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
5b9cb85b0f
commit
26488b40ce
1 changed files with 300 additions and 131 deletions
|
|
@ -30,7 +30,10 @@ Endpoints, under the nickname `base` in a host's client (`client.modules.base.em
|
|||
- GitHub keeps only the numeric GitHub ID, in Serverpod's own table; email keeps only
|
||||
HMAC-SHA256 of the address, keyed with `emailSignInPepper` (`email_identity`), and its
|
||||
codes as Argon2id hashes (`email_code_request`). Codes are eight Crockford characters,
|
||||
valid 15 minutes, 3 tries; at most 3 an hour per address and 10 per network.
|
||||
valid 15 minutes, 3 tries; up to 3 valid at once for an address (a fourth voids the
|
||||
oldest, so codes others ask for don't void the one its owner is typing); at most 3 an
|
||||
hour per address and network, 10 per address from every network (no mailbox flooded)
|
||||
and 10 per network.
|
||||
- Profiles: a handle as Mastodon's (1 to 30 letters, digits or underscores, unique
|
||||
whatever their case, a few reserved for the instance), fixed once the host says so
|
||||
(`fixHandle`; Halkyon Learn at the first publish); a display name, a bio, up to 4
|
||||
|
|
@ -205,7 +208,12 @@ Built on the three parts above, on the register (members forward every step thro
|
|||
address's hash, the same queries and arithmetic, and the same refusal: a wrong
|
||||
password, an unknown address and a wrong, used or missing code are all
|
||||
`wrongCredentials`; `setupIncomplete` and `notDue` come only after a right password.
|
||||
At most 10 sign-ins begun per address and 30 per network an hour.
|
||||
At most 10 sign-ins begun per address and network an hour (5 proofs of the phrase),
|
||||
30 per network, and, from every network together, 30 failed proofs per address
|
||||
(wrong passwords, phrases' signatures by another key; an address nobody has alike),
|
||||
past which no sign-in or proof begins for it anywhere until the hour has passed: so
|
||||
whoever knows an address and fills its count from one network holds no other back,
|
||||
and guessing from many makes at most 30 guesses an hour.
|
||||
- **Authenticators:** a secret made on the register, shown once as an `otpauth://` URI
|
||||
(issuer: the account domain); confirmed by a code; while the account has a confirmed
|
||||
one, another counts only with a code from that one too (`wrongExistingCode`), so a
|
||||
|
|
|
|||
Loading…
Reference in a new issue