Here is a summary of my understanding after reading what others have posted:
Important!
Base64 encoding is not meant to provide security
Base64 encoding is not meant to compress data
Why do we use Base64
Base64 is a text representation of data that consists of only 64 characters which are the alphanumeric characters (lowercase and uppercase), +, / and =.
These 64 characters are considered ‘safe’, that is, they can not be misinterpreted by legacy computers and programs unlike characters such as <, > \n and many others.
When is Base64 useful
I've found base64 very useful when transfering files as text. You get the file's bytes and encode them to base64, transmit the base64 string and from the receiving side you do the reverse.
This is the same procedure that is used when sending attachments over SMTP during emailing.
How to perform base64 encoding/decoding
Conversion from base64 text to bytes is called decoding.
Conversion from bytes to base64 text is called encoding. This is a bit different from how other encodings/decodings are named.
Dotnet and Powershell
Microsoft's Dotnet framework has support for encoding and decoding bytes to base64. Look for the Convert
namespace in the mscorlib
library.
Below are powershell commands you can use:
// Base64 encode PowerShell
// See: https://adsecurity.org/?p=478
$Text='This is my nice cool text'
$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text)
$EncodedText = [Convert]::ToBase64String($Bytes)
$EncodedText
// Convert from base64 to plain text
[System.Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('VABoAGkAcwAgAGkAcwAgAG0AeQAgAG4AaQBjAGUAIABjAG8AbwBsACAAdABlAHgAdAA='))
Output>This is my nice cool text
Bash has a built-in command for base64 encoding/decoding. You can use it like this:
To encode to base64:
echo 'hello' | base64
To decode base64-encoded text to normal text:
echo 'aGVsbG8K' | base64 -d
Node.js also has support for base64. Here is a class that you can use:
/**
* Attachment class.
* Converts base64 string to file and file to base64 string
* Converting a Buffer to a string is known as decoding.
* Converting a string to a Buffer is known as encoding.
* See: https://nodejs.org/api/buffer.html
*
* For binary to text, the naming convention is reversed.
* Converting Buffer to string is encoding.
* Converting string to Buffer is decoding.
*
*/
class Attachment {
constructor(){
}
/**
*
* @param {string} base64Str
* @returns {Buffer} file buffer
*/
static base64ToBuffer(base64Str) {
const fileBuffer = Buffer.from(base64Str, 'base64');
// console.log(fileBuffer)
return fileBuffer;
}
/**
*
* @param {Buffer} fileBuffer
* @returns { string } base64 encoded content
*/
static bufferToBase64(fileBuffer) {
const base64Encoded = fileBuffer.toString('base64')
// console.log(base64Encoded)
return base64Encoded
}
}
You get the file buffer like so:
const fileBuffer = fs.readFileSync(path);
Or like so:
const buf = Buffer.from('hey there');
You can also use an API to do for you the encoding and encoding, here is one:
To encode, you pass in the plain text as the body.
POST https://mk34rgwhnf.execute-api.ap-south-1.amazonaws.com/base64-encode
To decode, pass in the base64 string as the body.
POST https://mk34rgwhnf.execute-api.ap-south-1.amazonaws.com/base64-decode
Fantasy example of when you might need base64
Here is a far fetched scenario of when you might need to use base64.
Suppose you are a spy and you're on a mission to copy and take back a picture of great value back to your country's intelligence.
This picture is on a computer that has no access to internet and no printer. All you have in your hands is a pen and a single sheet of paper. No flash disk, no CD etc. What do you do?
Your first option would be to convert the picture into binary 1s and 0s , copy those 1s and 0s to the paper one by one and then run for it.
However, this can be a challenge because representing a picture using only 1s and 0s as your alphabet will result in very many 1s and 0s. Your paper is small and you dont have time. Plus, the more 1s and 0s the more chances of error.
Your second option is to use hexadecimal instead of binary. Hexadecimal allows for 16 instead of 2 possible characters so you have a wider alphabet hence less paper and time required.
Still a better option is to convert the picture into base64 and take advantage of yet another larger character set to represent the data. Less paper and less time to complete. There you go!