libsodium nonce e captcha validation

1

quindi, voglio implementare un server che convalidi la registrazione con captcha. Per prima cosa ho pensato di archiviare i captcha in un server, ma poi ho pensato che sarebbe stato un problema con il caching, la memoria, se avessi bisogno di scriverlo in un file, ecc ... Ma poi ho avuto questa idea geniale (probabilmente qualcun altro l'ha già fatto it), che dire di solo inviare captcha al client, anche inviare la risposta crittografata, e quando l'utente risponde invia il captcha (o forse un sommario di esso, se è un po 'più grande) e posso semplicemente decifrare la risposta dal cliente. BOOM, non ho bisogno di memorizzare migliaia di miliardi di immagini e posso ridimensionarle quanto voglio! (diversi server potrebbero inviare captcha e diversi potrebbero servire la risposta).

Ora, ho solo un problema. Ho bisogno di un nonce per crittografare le cose in libsodium. Come in qui link . Ora, se lo faccio ogni volta, inviamo all'utente affinché l'utente lo rispedisca, quindi è pubblico, che senso ha? Oppure, se uso costante nonce, allora, che senso ha? Server e client possono cercarlo.

Cosa dovrei fare qui? Dovrei usare costante nonce in questa situazione o dovrei generarlo ogni volta e perché?

    
posta Shazzlow 27.10.2015 - 19:27
fonte

1 risposta

1

Se è stateless, lo schema è vulnerabile agli attacchi di riproduzione.

Un client può rispondere con lo stesso captcha + ciphertext ogni volta, indipendentemente dal testo cifrato inizialmente inviato.

Usa un timesamp + byte casuali come nonce. Questo non deve essere segreto, solo la chiave deve rimanere segreta.

Invece di crittografare il captcha, puoi utilizzare un hash con chiave.

  • Il server invia Hk(captcha) || timestamp || randombytes con k = secret || timestamp || randombytes . Puoi utilizzare crypto_auth() o crypto_generichash() per questo e utilizzare un segreto di 192 bit, un timestamp approssimativo a 32 bit e una parte casuale a 32 bit.
  • Il cliente invia Hk(captcha) || timestamp || randombytes || captcha
  • Il server calcola H'k(captcha) utilizzando captcha, timestamp e randombytes inviati dal client e verifica che il timestamp sia vicino all'ora corrente e che H'k(captcha) corrisponda a Hk(captcha) .
risposta data 20.12.2015 - 00:28
fonte

Leggi altre domande sui tag