es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Validando firma RS256 con PHP

Estoy teniendo problemas para verificar una firma RS256 en PHP a partir de un JWT.

Tengo

$to_verify = substr(Cookie::get('CF_Authorization'), 0, strrpos(Cookie::get('CF_Authorization'), "."));
$signature = base64_decode(explode('.', Cookie::get('CF_Authorization'))[2]);
return openssl_verify($to_verify, $signature, $cert, 'RSA-SHA256'));

Parte de mi problema es que no sé cuál es el algoritmo más correcto para usar, el encabezado dice “alg”: “RS256”. ¿Entonces es eso?:

  • OPENSSL_ALGO_SHA256
  • “SHA256”
  • “sha256”
  • “RSA-SHA256”
  • “sha256WithRSAEncryption”
  • ¿Algo más?

He probado todas esas opciones de la documentación de PHP que parecen ser correctas, pero no importa lo que intente, siempre devuelve 0 (no verificado), pero según jwt.io, el jwt, la firma y la clave pública con la que estoy probando son válidos.

No estoy seguro de qué estoy haciendo mal.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que estás teniendo problemas al verificar una firma RS256 en PHP desde un JWT. En tu código, estás utilizando la función ‘openssl_verify()’ para realizar la verificación. Sin embargo, no tienes claro el algoritmo correcto a usar, ya que el encabezado del JWT especifica “alg”: “RS256”. Has probado diferentes algoritmos, incluyendo ‘OPENSSL_ALGO_SHA256’ y ‘RSA-SHA256’, pero ninguno de ellos devuelve un resultado verificado.

    Una posible razón para este problema podría ser la clave pública utilizada para la verificación. Asegúrate de estar usando la clave pública correcta que corresponde a la clave privada utilizada para crear la firma. También puedes intentar generar un nuevo par de claves y usar la nueva clave pública para verificar y ver si eso resuelve el problema.

    Otra cosa que debes verificar es el formato de la firma. RS256 utiliza una firma codificada en base64url, que es diferente de una codificación base64 regular. Asegúrate de decodificar la firma utilizando el método correcto.

    Finalmente, también puedes intentar utilizar una biblioteca JWT o un paquete de PHP que admita la verificación RS256, en lugar de implementarla tú mismo utilizando OpenSSL. Esto puede ahorrarte tiempo y esfuerzo, y también asegurará que la verificación se realice correctamente. Muchos frameworks populares de PHP, como Laravel y Symfony, tienen soporte incorporado para autenticación JWT.

    En general, verificar una firma RS256 en PHP puede ser complicado, pero con el enfoque y las herramientas correctas, se puede hacer de manera segura y eficiente.

Comments are closed.