Hay una cadena en particular (URL) que debo enviar desde mi servidor web al navegador. El navegador deberá inspeccionar la cadena y luego enviarla de nuevo sin modificar (también puede solicitar el recurso al que apunta la URL). Si el navegador pudiera modificar la cadena, sería un riesgo de seguridad. Así que necesito asegurarme de que la cadena no haya sido manipulada.
Para hacer eso, necesito proporcionar algún tipo de suma de comprobación en la URL que el servidor pueda validar, pero que el cliente no pueda generar. Dos enfoques vienen a la mente:
- Agregue alguna cadena secreta (también conocida como "sal", preferiblemente bastante larga y aleatoria) a la URL y córtela con SHA1. Como el cliente no conoce la cadena secreta, no debería poder generar el hash para una URL diferente. Mi preocupación: ya que puede recopilar varias de estas URL generadas en el lado del servidor (en el orden de unas pocas docenas), ¿quizás pueda aplicar ingeniería inversa a la sal?
- Lo mismo que antes, pero también cifrarlo con AES. Esto es más lento, pero hay una criptografía real involucrada. Mi preocupación: SHA1 genera 160 bits, mientras que AES funciona con bloques de 128 bits. Así que el hash tendrá que ser rellenado, probablemente con ceros. Además, hay solo 2 cuadras. ¿Eso no permitirá que el atacante descubra la clave fácilmente?
¿Es alguno de estos enfoques realmente seguro? ¿O debería intentar hacer algo completamente distinto?