validación de nonce y captcha de libsodium

1

entonces, quiero implementar un servidor que valide el registro con captcha. Primero pensé en almacenar captchas en un servidor, pero luego pensé que sería una molestia en el almacenamiento en caché, la memoria, y si tengo que escribirlo en un archivo, etc ... Pero luego tuve esta idea genial (probablemente alguien más ya lo hizo it), ¿qué tal si solo enviamos captcha al cliente, también enviamos la respuesta encriptada, y cuando el usuario responde, envía el captcha (o quizás un resumen de la misma, si es un poco más grande) y simplemente puedo descifrar la respuesta de la respuesta? cliente. ¡BOOM, no necesito almacenar miles de imágenes y puedo escalarlas tanto como quiera! (Un servidor diferente podría enviar captcha y otro podría servir para la respuesta).

Ahora, solo tengo un problema. Necesito un nonce para cifrar cosas en libsodium. Al igual que aquí, enlace . Ahora, si genero esto cada vez, envíelo al usuario para que lo devuelva, entonces es público, ¿cuál es el punto de eso? O, si uso nonce constante entonces, aún, ¿cuál es el punto de eso? El servidor y el cliente pueden buscarlo.

¿Qué debo hacer aquí? ¿Debo usar nonce constante en esta situación o debo generarlo cada vez y por qué?

    
pregunta Shazzlow 27.10.2015 - 19:27
fuente

1 respuesta

1

Si no tiene estado, tu esquema es vulnerable a los ataques de repetición.

Un cliente puede responder con el mismo texto cifrado + captcha cada vez, sin importar qué texto cifrado se envió inicialmente.

Utilice un timetamp + bytes aleatorios como nonce. Esto no tiene que ser secreto, solo la clave debe permanecer secreta.

En lugar de cifrar el captcha, puedes usar un hash con clave.

  • El servidor envía Hk(captcha) || timestamp || randombytes con k = secret || timestamp || randombytes . Puede usar crypto_auth() o crypto_generichash() para esto, y usar un secreto de 192 bits, una marca de tiempo aproximada de 32 bits y una parte aleatoria de 32 bits.
  • El cliente envía Hk(captcha) || timestamp || randombytes || captcha
  • El servidor calcula H'k(captcha) usando el captcha, la marca de tiempo y los randombytes enviados por el cliente, y verifica que la marca de tiempo se acerca a la hora actual y que H'k(captcha) coincide con Hk(captcha) .
respondido por el Frank Denis 20.12.2015 - 00:28
fuente

Lea otras preguntas en las etiquetas