Da un breve sguardo al modulo sta usando un semplice HMAC insieme a SHA-1 (o SHA) -512 nelle versioni più recenti). Questo è lo stesso algoritmo utilizzato in TLS per rilevare la manipolazione dei dati.
Ma un HMAC può essere calcolato velocemente. I principali costi nell'HMAC sono il calcolo dell'hash (cioè SHA-1 nel tuo caso) che è necessario due volte. Ciò significa che se hai un segreto debole è possibile un attacco di forza bruta. E, mentre Signer sembra offrire l'uso di una funzione di derivazione della chiave per "indurire" la chiave, le funzioni offerte sono solo un singolo hash o un HMAC (cioè due hash), che non rallentano davvero un attacco di forza bruta.
Ciò significa che la sicurezza di questo approccio sta nella scelta di una buona chiave segreta, ad esempio una lunga stringa casuale invece di una breve password comparabile. Sfortunatamente la documentazione non mostra realmente quali chiavi sono sicure e fornisce solo alcune raccomandazioni simili alle raccomandazioni sulle password:
Given a key only you know ... So if you keep the key secret and complex, you will be fine.
Ma da raccomandazioni di password simili sappiamo tutti quanto saranno sicure tali chiavi alla fine. Quello che dovresti veramente usare è nascosto nel codice sorgente nella documentazione di derive_key
:
def derive_key(self):
...
Keep in mind that the key derivation in itsdangerous is not intended
to be used as a security method to make a complex key out of a short
password. Instead you should use large random secret keys.
Quello che segue creerebbe un segreto con 128 bit casuali che è sufficientemente sicuro contro gli attacchi di forza bruta:
import os
secret_key = os.urandom(16)