I was working with the Spotify API and reading through the authorization documentation. Like most APIs, we need to securely access the service, authorized as the client application or on behalf of a user. We’ll need to deal with secret tokens and likely encode them into a
Base64 string in that process. The client credentials flow requires we concatenate the service provided secrets of
clientSecret, after which we Base64 encode the result.
The authorization step made me wonder, “why the heck do we need to Base64 encode these values in the first place?” In this post, we’ll learn why Base64 encoding is necessary and how to perform encoding and decoding in C#.
What Is Base64?
Base64 is a binary-to-text encoding scheme that represents binary data in an ASCII string format. The design of Base64 helps transmit binary formats across transports that only reliably support text content. Some examples include HTTP and SMTP. We can also see the encoding commonly used in web development, as Base64 values can represent images in cascading style sheets (CSS) and HTML pages.
While values Base64 encoded values are illegible, the encoding process shouldn’t be confused for security. As we’ll see later in this post, we can decode encoded values back to their original value.
To read more on the Base64 encoding, I recommend the Wikipedia article.
Encoding A String
As this section’s title may hint at, we’ll need to choose an
Encoding that will represent our final result. Folks will need to check their API documentation, but
ASCII is a safe bet when encoding values. Let’s take a look at the C# code.
using System; using System.Text; using static System.Console; string khalid; khalid = nameof(khalid); byte bytes; bytes = Encoding.ASCII.GetBytes(khalid); var base64 = Convert.ToBase64String(bytes); WriteLine(base64);
Note that we’re using the
System.Text.Encoding class and the
System.Convert class to get the bytes representing our string. Remember that Base64 is a binary representation scheme, and bytes are binary (1’s and 0’s). We then use the
ToBase64String method to finish the process. The result of our code is as follows.
Remember, this is a reversible process. Let’s see how we can decode the value of
a2hhbGlk back to
Decoding A String
Similar to encoding to Base64, we’ll be using the
System.Convert helper class, along with
System.Text.Encoding. Let’s update our sample.
using System; using System.Text; using static System.Console; string khalid; khalid = nameof(khalid); byte bytes; bytes = Encoding.ASCII.GetBytes(khalid); var base64 = Convert.ToBase64String(bytes); WriteLine(base64); // decoding starts here bytes = Convert.FromBase64String(base64); var decoded = Encoding.ASCII.GetString(bytes); WriteLine(decoded);
Running the code above results in the following console output.
Decoding is a bit more challenging as we need to know the original encoding of our actual value. Additionally, since we are dealing with a
byte in the intermediary step, we also need to know the final target type. In our case, we know we’ll be decoding a
string, but we could also be decoding images, audio, or other complex types.
Base64 encoding is everywhere if you know where to look, and it’s an essential part of reliably passing information on the web. When working with APIs using the HTTP protocol, we can expect to perform some encoding/decoding. Hopefully, this post explained why it’s necessary to do so. With a few lines of C# code, we can encode and encode data simply. I hope you enjoyed this post, and please leave a comment about the places you use Base64 encoding/decoding.