mirror of
https://github.com/rstrouse/ESPSomfy-RTS.git
synced 2026-10-31 13:52:15 +01:00
feat: sign tokens with a secret key, compare them in constant time
Tokens were HMAC(serverId, credentials + client IP). serverId is public (mDNS, MQTT, /loginContext), so anyone who saw a token could test PIN guesses offline. The key is now 32 random bytes made on first boot in their own NVS namespace, which no settings save clears and no backup holds. It is made before WiFi starts, from the bootloader's entropy source. Tokens are compared with tokenMatches, which takes the same time whatever the guess, on the apikey header, the socket upgrade and /login. createAPIToken never freed its mbedtls context, so every token it made leaked: 563 bytes per login on the device, until it ran out of memory after about 150 logins. It now frees it: 0 bytes over 500 logins. Every token made before the upgrade is refused once. The web UI asks for login again, and Home Assistant 3.0 logs in again by itself. Closes #80 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
ff7517e10f
commit
43191ba312
8 changed files with 144 additions and 13 deletions
|
|
@ -148,6 +148,10 @@ _Avoid_: Secure Config Only (removed)
|
|||
What logging in returns. It stands for the PIN or password, on one client address, and every request under Secured carries it.
|
||||
_Avoid_: session, API key (the name of the field it travels in)
|
||||
|
||||
**Token key**
|
||||
The secret a token is made with: random bytes the device makes on first boot and never sends anywhere. Changing it refuses every token.
|
||||
_Avoid_: API key, server key
|
||||
|
||||
**Login throttle**
|
||||
How the device slows down guessing: a client address with too many failed logins is refused for a while, and each refusal is a *lockout*, longer than the one before.
|
||||
_Avoid_: login backoff, rate limit
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue