La Representación Concisa de Objetos Binarios ( CBOR ) es un formato de serialización de datos binarios basado libremente en JSON , creado por Carsten Bormann y Paul Hoffman. [ a ] Al igual que JSON, permite la transmisión de objetos de datos que contienen pares nombre-valor , pero de una manera más concisa. Esto aumenta la velocidad de procesamiento y transferencia a costa de la legibilidad humana . Está definido en el RFC 8949 de la IETF . [ 2 ]
Entre otros usos, es la capa de serialización de datos recomendada para el conjunto de protocolos CoAP de Internet de las Cosas [ 3 ] y el formato de datos en el que se basan los mensajes COSE . También se utiliza en el Protocolo Cliente-Autenticador (CTAP) dentro del ámbito del proyecto FIDO2. [ 4 ]
CBOR se inspiró en MessagePack , desarrollado y promovido por Sadayuki Furuhashi. CBOR extendió MessagePack, en particular al permitir distinguir cadenas de texto de cadenas de bytes, lo cual se implementó en MessagePack en 2013. [ 5 ] [ 6 ]
Especificación de la codificación CBOR
Los datos codificados en CBOR se visualizan como una secuencia de elementos de datos. Cada elemento consta de un byte de encabezado que contiene un tipo de 3 bits y un contador corto de 5 bits. A continuación, se incluye un contador extendido opcional (si el contador corto está entre 24 y 27) y una carga útil opcional.
Para los tipos 0, 1 y 7, no hay carga útil; el valor es el contador. Para los tipos 2 (cadena de bytes) y 3 (cadena de texto), el contador es la longitud de la carga útil. Para los tipos 4 (matriz) y 5 (mapa), el contador es el número de elementos (pares) en la carga útil. Para el tipo 6 (etiqueta), la carga útil es un solo elemento y el contador es un número de etiqueta que describe el elemento incluido.
Ejemplos
[{"x": 1, "yz": true}, [2, "w"]] --> 82 # array(2) A2 # mapa(2) 61 # texto(1) 78 # "x" 01 # sin signo(1) 62 # texto(2) 797A # "yz" F5 # primitivo(21) 82 # array(2) 02 # sin signo(2) 61 # texto(1) 77 # "w" Manejo de tipos y recuentos principales en cada elemento de datos
El comportamiento de cada elemento de datos se define por su tipo principal y su cantidad. El tipo principal se utiliza para seleccionar el comportamiento o tipo principal de cada elemento de datos.
El campo de conteo corto de 5 bits codifica directamente los conteos del 0 al 23. Los conteos cortos del 24 al 27 indican que el valor del conteo se encuentra en un campo de conteo extendido posterior de 8, 16, 32 o 64 bits. Los valores del 28 al 30 no están asignados y no deben utilizarse.
Los tipos se dividen en tipos "atómicos" 0-1 y 6-7 , para los cuales el campo de conteo codifica el valor directamente, y tipos no atómicos 2-5 , para los cuales el campo de conteo codifica el tamaño del siguiente campo de carga útil.
Se utiliza un conteo corto de 31 con los tipos no atómicos 2 a 5 para indicar una longitud indefinida; la carga útil son los siguientes elementos hasta un byte marcador de "ruptura" de 255 (tipo=7, conteo corto=31). No se permite un conteo corto de 31 con los otros tipos atómicos 0, 1 o 6.
El tipo 6 (etiqueta) es inusual porque su campo de conteo codifica un valor directamente, pero también tiene un campo de carga útil (que siempre consta de un solo elemento).
Los recuentos extendidos y todos los valores multibyte se codifican en orden de bytes de red (big-endian) .
Codificación de campos de elementos de datos CBOR
Codificación de campos pequeños
Codificación de campo corto
Codificación de campo largo
Números enteros (tipos 0 y 1)
Para los enteros, el campo count es el valor; no hay carga útil. El tipo 0 codifica enteros positivos o sin signo, con valores de hasta 2⁶⁴ − 1. El tipo 1 codifica enteros negativos, con un valor de −1 − count, para valores desde −2⁶⁴ hasta −1 .
Cadenas de caracteres (tipos 2 y 3)
Los tipos 2 y 3 tienen un campo de conteo que codifica la longitud en bytes de la carga útil. El tipo 2 es una cadena de bytes no estructurada. El tipo 3 es una cadena de texto UTF-8 .
Un conteo corto de 31 indica una cadena de longitud indefinida. A continuación, se presentan cero o más cadenas de longitud definida del mismo tipo, terminadas por un byte marcador de "salto". El valor del elemento es la concatenación de los valores de los elementos que lo componen. No se permiten elementos de un tipo diferente ni cadenas indefinidas anidadas. Las cadenas de texto deben estar bien formadas individualmente; los caracteres UTF-8 no pueden dividirse entre elementos.
Matrices y mapas (tipos 4 y 5)
El tipo 4 tiene un campo de conteo que codifica la cantidad de elementos siguientes, seguido de esa misma cantidad de elementos. No es necesario que todos los elementos sean del mismo tipo; algunos lenguajes de programación lo denominan "tupla" en lugar de "matriz".
Como alternativa, se puede utilizar una codificación de longitud indefinida con un conteo corto de 31. Esto continúa hasta un byte marcador de "salto" de 255. Dado que los elementos anidados también pueden usar la codificación indefinida, el analizador debe emparejar los marcadores de salto con los bytes de encabezado de longitud indefinida correspondientes.
El tipo 5 es similar, pero codifica un mapa (también llamado diccionario o matriz asociativa) de pares clave/valor. En este caso, el contador codifica la cantidad de pares de elementos. Si se utiliza la codificación de longitud indefinida, debe haber un número par de elementos antes del byte marcador de "salto".
Etiqueta semántica (tipo 6)
Una etiqueta semántica es otro tipo atómico para el cual el recuento es el valor, pero también tiene una carga útil (un único elemento siguiente), y ambos se consideran un solo elemento en, por ejemplo, una matriz o un mapa.
La etiqueta proporciona información adicional sobre el tipo del elemento siguiente, más allá de lo que puede proporcionar el tipo principal de 3 bits. Por ejemplo, una etiqueta de 1 indica que el siguiente número es un valor de tiempo Unix . Una etiqueta de 2 indica que la siguiente cadena de bytes codifica un número grande sin signo . Una etiqueta de 32 indica que la siguiente cadena de texto es una URI según se define en RFC 3986. RFC 8746 define las etiquetas 64 a 87 para codificar matrices homogéneas de valores enteros o de punto flotante de tamaño fijo como cadenas de bytes.
La etiqueta 55799 se asigna para indicar "A continuación, datos CBOR". Esto no tiene efectod9 d9 f7 semántico, pero permite anteponer los bytes de la etiqueta correspondiente a un archivo CBOR sin alterar su significado. Estos bytes pueden usarse como un " número mágico " para distinguir el inicio de los datos CBOR.
Los valores de etiqueta de unos 0xffff, 0xffffffff y 0xffffffffffffffff están reservados para indicar la ausencia de una etiqueta en una biblioteca de decodificación CBOR; nunca deben aparecer en un flujo de datos.
El pseudoelemento marcador de ruptura puede no ser la carga útil de una etiqueta.
Especial/flotante (tipo 7)
Este tipo principal se utiliza para codificar diversos valores especiales que no encajan en las demás categorías. Sigue las mismas reglas de tamaño de codificación que los otros tipos atómicos (0, 1 y 6), pero el campo de conteo se interpreta de manera diferente.
Los valores del 0 al 19 no están definidos actualmente.
Los valores 20 – 23 se utilizan para codificar los valores especiales false, true, null, y undefined.
Un conteo corto de 24 indica que le sigue un conteo extendido de 1 byte que podrá utilizarse en el futuro para codificar valores especiales adicionales. Para simplificar la decodificación, los valores del 0 al 31 podrían no codificarse de esta forma. Ninguno de los valores del 32 al 255 está definido actualmente.
Los valores cortos de 25, 26 o 27 indican que el campo de recuento extendido subsiguiente debe interpretarse como un valor de punto flotante IEEE de 16, 32 o 64 bits (big-endian) . Estos valores tienen el mismo tamaño que un recuento extendido, pero se interpretan de forma diferente. En particular, para todos los demás tipos principales, un recuento extendido de 2 bytes (0x1234) y uno de 4 bytes (0x00001234) son exactamente equivalentes. Esto no ocurre con los valores de punto flotante.
Los recuentos cortos de 28 a 30 están reservados, al igual que para todos los demás tipos principales.
Un conteo corto de 31 codifica el marcador especial de "ruptura" que finaliza una codificación de longitud indefinida. Esto está relacionado con, pero es diferente de, su uso con otros tipos principales donde un conteo corto de 31 inicia una codificación de longitud indefinida. Esto no es un elemento y puede no aparecer en una carga útil de longitud definida.
Registro de etiquetas semánticas
IANA ha creado el registro de etiquetas CBOR, ubicado en https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml . Los registros deben contener la plantilla que se describe a continuación. [ 7 ]
DAG-CBOR
La especificación DAG-CBOR es un subconjunto más estricto de CBOR, desarrollado por Protocol Labs . El problema que resuelve DAG-CBOR es que, en CBOR, un objeto puede serializarse de más de una manera. Por ejemplo, {"b":1,"a":2}puede representarse como
A2 # mapa(2) 61 # texto(1) 62 # "b" 01 # sin signo(1) 61 # texto(1) 61 # "a" 02 # sin signo(2) o
A2 # mapa(2) 61 # texto(1) 61 # "a" 02 # sin signo(2) 61 # texto(1) 62 # "b" 01 # sin signo(1) Esto significa que un objeto puede tener dos serializaciones diferentes. La especificación DAG-CBOR selecciona de forma única una única representación CBOR, de entre todas las posibles representaciones CBOR de un objeto. Algunos objetos que pueden tener una representación CBOR ya no tienen una representación DAG-CBOR, porque su naturaleza no permite una representación única. Por ejemplo, un elemento de longitud indefinida (que puede ser una cadena, una secuencia de bytes, una lista o un mapa) no tiene una representación DAG-CBOR, aunque pueda tener una representación CBOR. [ 8 ]
La especificación DAG-CBOR permite un almacenamiento consistente direccionable por contenido . En concreto, un dato se puede serializar de forma única como una secuencia de bytes, y esta secuencia se puede convertir en su identificador de contenido (CID), que se puede utilizar para el direccionamiento por contenido.
El nombre "DAG" significa " grafo acíclico dirigido ", ya que la especificación se creó específicamente para permitir objetos de datos en forma de DAG de Merkle .
Criptografía
Firma y cifrado de objetos
CBOR Object Signing and Encryption ( COSE ) es un formato binario para estructuras de datos CBOR autenticadas y/o cifradas . [ 9 ]
tokens web
Un token web CBOR ( CWT ) es un token firmado que utiliza CBOR como formato de serialización. Son una alternativa a los tokens web JSON (JWT). [ 10 ]
Véase también
Notas
Referencias
- ↑ Bormann, Carsten; Hoffman, Paul (2013-07-28). "Diseño y descripción general de CBOR" (PDF) . Actas de la IETF . Archivado (PDF) del original el 28-01-2025 . Recuperado el 01-06-2024 .
- ↑ Bormann , Carsten. "CBOR — Representación binaria concisa de objetos | Descripción general" . cbor.io. Archivado del original el 28 de enero de 2025. Consultado el 24 de agosto de 2016 .
- ↑ "CoAP — Protocolo de aplicación restringida | Descripción general" . Archivado del original el 3 de enero de 2017. Consultado el 28 de agosto de 2016 .
- ↑ "Proyecto FIDO2" . Alianza FIDO. Archivado del original el 22 de abril de 2018. Consultado el 11 de mayo de 2018 .
- ↑ "Discusiones sobre la próxima especificación MessagePack que agrega el tipo de cadena al protocolo" . GitHub . Archivado del original el 4 de enero de 2022. Recuperado el 4 de enero de 2022 .
- ↑ Bormann, Carsten; Hoffman, Paul E. (diciembre de 2020). "RFC 8949: Representación binaria concisa de objetos (CBOR)" . IETF. Archivado del original el 28 de enero de 2025. Consultado el 26 de diciembre de 2021 .
- ↑ Bormann, Carsten; Hoffman, Paul E. (diciembre de 2020). "RFC 8949: Representación binaria concisa de objetos (CBOR)" . Archivado del original el 28 de enero de 2025. Consultado el 25 de marzo de 2022 .
- ^ "Documentos de códec IPLD ♦: DAG-CBOR" . ipld.io. Consultado el 17 de marzo de 2026 .
- ↑ Schaad, J. (julio de 2017). "RFC 8152: Firma y cifrado de objetos CBOR (COSE)" . Archivado del original el 16 de noviembre de 2024. Recuperado el 4 de julio de 2025 .
- ^ Jones, M.; Wahlstroem, E.; Erdtman, S.; Tschofenig, H. (mayo de 2018). "RFC 8392: Token web CBOR (CWT)" . Consultado el 4 de julio de 2025 .
Enlaces externos
- Herramienta en línea para convertir de formato binario CBOR a representación textual y viceversa.
- Zona CBOR : Herramienta en línea para convertir un elemento CBOR o una secuencia CBOR en formato HEX, Base64, Base64URL o Notación de Diagnóstico CBOR a otro formato.
- formatos de serialización de datos