The Multibase Data Format
Juan Benet
Protocol Labs
548 Market Street, #51207
San Francisco
CA
94104
US
+1 619 957 7606
juan@protocol.ai
http://juan.benet.ai/
Manu Sporny
Digital Bazaar
203 Roanoke Street W.
Blacksburg
VA
24060
US
+1 540 961 4469
msporny@digitalbazaar.com
http://manu.sporny.org/
Security
base-encoding
base64
base58
Raw binary data is often encoded using a mechanism that enables the data to be included in human-readable text-based formats. This mechanism is often referred to as "base-encoding the data". Base-encoding is often used when expressing binary data in hyperlinks, cryptographic keys in web pages, or security tokens in application software. There are a variety of base-encodings, such as base32, base58, and base64. It is not always possible to differentiate one base-encoding from another. The purpose of this specification is to provide a mechanism to be able to deterministically identify the base-encoding for a particular string of data.

Feedback
This specification is a joint work product of Protocol Labs, the W3C Digital Verification Community Group, and the W3C Credentials Community Group. Feedback related to this specification should logged in the issue tracker or be sent to public-credentials@w3.org. .

Introduction
This specification describes a forward-compatible data model for expressing raw binary data in a variety of base-encoding formats such as base32, base58. and base64.
When text is encoded as bytes, we can usually use a one-size-fits-all encoding (UTF-8) because we're always encoding to the same set of 256 bytes. When that doesn't work, usually for historical or performance reasons, we can usually infer the encoding from the context.
However, when bytes are encoded as text (using a base encoding), the choice of base encoding is often restricted by the context. Worse, these restrictions can change based on where the data appears in the text. In some cases, we can only use [a-z0-9]. In others, we can use a larger set of characters but need a compact encoding. This has lead to a large set of "base encodings", one for every use-case. Unlike when encoding text to bytes, we can't just standardize around a single base encoding because there is no optimal encoding for all cases.
Unfortunately, it's not always clear what base encoding is used; that's where this specification comes in. It answers the question:
Given data 'd' encoded into text 's', what base is it encoded with?

The Multibase Format
A multibase-encoded value follows a simple format:
base-encoding-character base-encoded-data
The encoding algorithm is a single character value that is always the first byte of the data. The possible values for this field are provided in The Multibase Algorithm Registry.

A Multibase Example
The following is an encoding of "Hello World!" using the version of base-58 that utilizes the Bitcoin encoding character set:
z2NEpo7TZRRrLZSi2U
The first byte (z) specifies the multibase encoding algorithm. The rest of the data specifies the value of the output of the multibase encoding algorithm.

Normative References

Security Considerations
There are a number of security considerations to take into account when implementing or utilizing this specification.
TBD

Test Values
The multibase examples are chosen to show different encoding algorithms and different output lengths at play. The input test data for all of the examples in this section is:
Multibase is awesome! \o/

Hexadecimal upper-case encoding

F4D756C74696261736520697320617765736F6D6521205C6F2F

Base-32 upper-case encoding, no padding

BJV2WY5DJMJQXGZJANFZSAYLXMVZW63LFEEQFY3ZP

Base-58 Bitcoin encoding

zYAjKoNbau5KiqmHPmSxYCvn66dA1vLmwbt

Base-64 with padding and MIME-encoding

MTXVsdGliYXNlIGlzIGF3ZXNvbWUhIFxvLw==

Acknowledgements
The editors would like to thank the following individuals for feedback on and implementations of the specification (in alphabetical order):

IANA Considerations

The Multibase Algorithms Registry
The following initial entries should be added to the Multibase Algorithms Registry to be created and maintained at (the suggested URI) http://www.iana.org/assignments/multibase-algorithms:

Multihash Algorithms Registry
Algorithm | Identifier (character) | Status | Specification
identity | 0x00 | active | 8-bit binary (encoder and decoder keeps data unmodified)
base2 | 0 | active | binary (01010101)
base8 | 7 | active | octal
base10 | 9 | active | decimal
base16 | f | active | hexadecimal
base16upper | F | active | hexadecimal
base32hex | v | active | RFC 4648 case-insensitive - no padding - highest char
base32hexupper | V | active | RFC 4648 case-insensitive - no padding - highest char
base32hexpad | t | active | RFC 4648 case-insensitive - with padding
base32hexpadupper | T | active | RFC 4648 case-insensitive - with padding
base32 | b | active | RFC 4648 case-insensitive - no padding
base32upper | B | active | RFC 4648 case-insensitive - no padding
base32pad | c | active | RFC 4648 case-insensitive - with padding
base32padupper | C | active | RFC 4648 case-insensitive - with padding
base32z | h | active | z-base-32 (used by Tahoe-LAFS)
base36 | k | active | base36 [0-9a-z] case-insensitive - no padding
base36upper | K | active | base36 [0-9a-z] case-insensitive - no padding
base58btc | z | active | base58 bitcoin
base58flickr | Z | active | base58 flicker
base64 | m | active | RFC 4648 no padding
base64pad | M | active | RFC 4648 with padding - MIME encoding
base64url | u | active | RFC 4648 no padding
base64urlpad | U | active | RFC 4648 with padding
proquint | p | active | PRO-QUINT https://arxiv.org/html/0901.4016
base256emoji | 🚀 | active | base256 with custom alphabet using variable-sized-codepoints
NOTE: The most up to date place for developers to find the table above is https://github.com/multiformats/multibase/blob/master/multibase.csv.