La firma è sicura dagli attacchi brute force?

1

Sto usando suo pericoloso per firmare una stringa usando una chiave segreta . Dice che il meccanismo di firma è HMAC e SHA1 e che è un'implementazione del modulo di firma di Django.

Supponendo che io usi una chiave segreta per firmare molte stringhe e che un utente malintenzionato ottenga la firma completa my string.wh6tMHxLgJqB6oY1uT73iMlyrOA (inclusa la parte "mia stringa"), quanto sarebbe facile per l'attaccante forzare questa forza e guadagnare controllo della mia chiave segreta?

Presumo che l'autore dell'attacco possa intuire che sto usando il suo pericoloso e che potrebbe spendere soldi per fornire un certo numero di cloud server.

È qualcosa di cui dovrei preoccuparmi?

    
posta Justin Krause 09.08.2017 - 17:07
fonte

1 risposta

3

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)
    
risposta data 09.08.2017 - 17:48
fonte

Leggi altre domande sui tag