La estandarización para la firma JSON, denominada JSON Web Signature, ha sido iniciada por el Grupo de Trabajo JOSE del IETF [1].
El borrador inicial
Mi nombre se menciona porque traje algo que estaba siendo considerado por el Grupo de Trabajo AB/C de la Fundación OpenID al IETF [2].
@ritou dijo: “¿Qué es una solicitud firmada en la era OAuth 2.0?”, pero en Facebook solicitud_firmada muy similar a
La gran diferencia es que la solicitud_firmada es
Firma.
Por el contrario, en JWS,
encabezado.cuerpo.firma
Se ha convertido. Hay una razón para esto.
¿Por qué “Encabezado.Cuerpo.Firma”?
Algunos pueden argumentar que sería mejor hacerlo igual que el campeón mundial, Facebook, pero hay una razón lógica por la que ha llegado a ser así.
¿Por qué están separados los encabezados?
En el caso de la solicitud_firmada, el parámetro de firma se incluye en el cuerpo. Si desea cifrar el cuerpo, no puede adoptar este enfoque. Esto se debe a que incluso los parámetros de descifrado están cifrados. Por lo tanto, es necesario separar estos parámetros relacionados con el cifrado en la sección del encabezado.
Estamos intentando que JWS y JWE sean lo más comunes posible. Entonces tuve que separar los encabezados.
¿Por qué está la firma al final?
Otra gran diferencia visual es que en firmado_request la firma es la primera, mientras que en JWS la firma es la última. JWS coloca la firma al final para transmitir la creación de la firma. Esto significa que si intenta agregar una firma primero, todos los datos deben almacenarse en un buffer hasta que finalice el proceso de firma y luego enviarse como "signature.body", mientras que el título se agrega al final. puede enviar más y más datos, por lo que no es necesario almacenar todos los datos en un buffer y es "fácil" para los recursos del servidor. No hay una gran diferencia si solo firma una pequeña cantidad de datos como firmado_request, pero JWS también puede firmar una gran cantidad de datos, por lo que se tiene en cuenta esta consideración.
características comunes
singed_request, JWS también tienen algunas características comunes. Los típicos son
- Sin normalización de datos
- Utilice base64url para la serialización
- Utilice JSON como formato de datos
- Cualquier dato se puede firmar.
Sin normalización de datos
Existe un estándar llamado Firma Digital XML. Muy versátil y flexible. Sin embargo, se ha dicho que tiene baja compatibilidad entre diferentes implementaciones y muchos desarrolladores no le agradan. La razón principal parece ser la normalización de los datos XML. Ni firmado_request ni JWS realizan ninguna canonicalización para evitar este problema. Utilice los datos originales tal como están.
Utilice base64url para la serialización
A menudo me preguntan por qué uso base64url en lugar de base64. La respuesta es que base64 contiene caracteres que no son seguros para la Web, como "=". JWS se puede colocar en encabezados HTTP o en parámetros GET y POST. En lugar de escapar de cada ``=", es mejor no utilizar el relleno ``=".
Utilice JSON como formato de datos
La razón por la que se utiliza JSON en lugar de XML es que JSON es más compacto, tiene mejor rendimiento de procesamiento y, sobre todo, es popular entre los desarrolladores.
Cualquier dato se puede firmar.
Por el momento, este es un método para firmar JSON, pero puede firmar cualquier dato simplemente ingresando datos codificados en base64url como uno de los parámetros JSON.
¿Quién utiliza JWS?
Espero que entiendas por qué hay tanta diferencia. Sin embargo, quizás estés pensando: "Si no uso Facebook, ¿qué sentido tiene?". Me gustaría responder a esto de la siguiente manera.
En primer lugar, no es que Facebook haya decidido no usarlo. Están contentos con la solicitud firmada actual y simplemente no sienten la necesidad de usar JWS para ese propósito. Puede usarse para otros fines. Además, si JWS se vuelve más común a largo plazo, ¿quizás Facebook podría brindar soporte adicional ya que es más "amigable para los desarrolladores"?
Además, incluso si Facebook no lo usa, se espera que muchos jugadores lo usen. Actualmente, estos incluyen Microsoft, Google, Salesforce, AOL y eBay.
¿Cuándo debo responder?
Creo que JWS es relativamente sofisticado. De hecho, empresas como Google y eBay lo han implementado. Así que creo que puedes empezar a seguirme ahora, siempre y cuando no te importen algunos cambios.[3] Si necesita alguna firma, considere utilizar JWS.
[1] Al mismo tiempo, ha comenzado un estándar de cifrado llamado JSON Web Encryption.
[2] Decidimos estandarizarlo en el IETF porque puede usarse no solo para estándares de identidad como OpenID Connect, sino también para fines generales. JSON Web Token y Simple Web Discovery también son especificaciones que se introdujeron de la misma manera.
[3] Mientras tanto, JWE está a punto de someterse a una cirugía menor. Específicamente, DEBE agregarse la verificación de integridad cuando se usa el modo CBC. Así que hasta el próximo borrador.

Me pregunto si no es razonable aplicar la normalización a la representación de datos semiestructurados. Quería tomar un hash y normalizarlo para comparar rápidamente las coincidencias y discrepancias entre objetos JSON, pero...