In python, we can use base64 to encode a string and transfer it. To encode and decode a string with base64, we can read this tutorial.
A Simple Guide to Python Base64 Encode String for Beginners – Python Tutorial
However, the basic base64 function is not safe, as to function:
base64.b64encode(s, altchars=None)
- base64.b64encode(s, altchars=None)
base64.b64encode(s, altchars=None)
This function can encode a string with base64, however, the result contains some characters, such as +, / and =. They are not safe to url.
Here is an example.
import base64
str = 'https://www.example.com/c%c/c++/?id=1&p=3'
base64_nosafe = base64.b64encode(str.encode(encoding='utf-8', errors='strict'))
print(base64_nosafe)
- import base64
- str = 'https://www.example.com/c%c/c++/?id=1&p=3'
- base64_nosafe = base64.b64encode(str.encode(encoding='utf-8', errors='strict'))
- print(base64_nosafe)
import base64
str = 'https://www.example.com/c%c/c++/?id=1&p=3'
base64_nosafe = base64.b64encode(str.encode(encoding='utf-8', errors='strict'))
print(base64_nosafe)
The encode result is:
b’aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vYyVjL2MrKy8/aWQ9MSZwPTM=‘
Here, we can find / and = in result.
To avoid +, / characters, base64 library provides url safe function.
base64.urlsafe_b64encode(s)
- base64.urlsafe_b64encode(s)
base64.urlsafe_b64encode(s)
Here is an example to show how to use it.
base64_safe = base64.urlsafe_b64encode(str.encode(encoding='utf-8', errors='strict'))
print(base64_safe)
- base64_safe = base64.urlsafe_b64encode(str.encode(encoding='utf-8', errors='strict'))
- print(base64_safe)
base64_safe = base64.urlsafe_b64encode(str.encode(encoding='utf-8', errors='strict'))
print(base64_safe)
The safe encode result is:
b’aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vYyVjL2MrKy8_aWQ9MSZwPTM=‘
However, there is also ‘=‘ in result?
How to improve base64 encode and decode string to avoid +, / and =?
Here we write two functions to improve base64 encode and decode string safely.
Improved base64 encode
def urlsafe_b64encode(data):
data = base64.b64encode(data.encode("utf-8"))
data = data.decode("utf-8")
data = data.replace("+",'-')
data = data.replace("/",'_')
data = data.replace("=",'')
return data
- def urlsafe_b64encode(data):
- data = base64.b64encode(data.encode("utf-8"))
- data = data.decode("utf-8")
- data = data.replace("+",'-')
- data = data.replace("/",'_')
- data = data.replace("=",'')
- return data
def urlsafe_b64encode(data):
data = base64.b64encode(data.encode("utf-8"))
data = data.decode("utf-8")
data = data.replace("+",'-')
data = data.replace("/",'_')
data = data.replace("=",'')
return data
Improved base64 decode
def urlsafe_b64decode(str):
data = str
data = data.replace("-",'+')
data = data.replace("_",'/')
mod4 = len(data) % 4
if(mod4):
temp = '===='
data += temp[0:mod4]
data = base64.b64decode(data.encode("utf-8"))
return data.decode("utf-8")
- def urlsafe_b64decode(str):
- data = str
- data = data.replace("-",'+')
- data = data.replace("_",'/')
- mod4 = len(data) % 4
- if(mod4):
- temp = '===='
- data += temp[0:mod4]
- data = base64.b64decode(data.encode("utf-8"))
- return data.decode("utf-8")
def urlsafe_b64decode(str):
data = str
data = data.replace("-",'+')
data = data.replace("_",'/')
mod4 = len(data) % 4
if(mod4):
temp = '===='
data += temp[0:mod4]
data = base64.b64decode(data.encode("utf-8"))
return data.decode("utf-8")
How to use?
safe_encode = urlsafe_b64encode(str)
print(safe_encode)
safe_decode = urlsafe_b64decode(safe_encode)
print(safe_decode)
- safe_encode = urlsafe_b64encode(str)
- print(safe_encode)
- safe_decode = urlsafe_b64decode(safe_encode)
- print(safe_decode)
safe_encode = urlsafe_b64encode(str)
print(safe_encode)
safe_decode = urlsafe_b64decode(safe_encode)
print(safe_decode)
The result is:
aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vYyVjL2MrKy8_aWQ9MSZwPTM
https://www.example.com/c%c/c++/?id=1&p=3
- aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vYyVjL2MrKy8_aWQ9MSZwPTM
- https://www.example.com/c%c/c++/?id=1&p=3
aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vYyVjL2MrKy8_aWQ9MSZwPTM
https://www.example.com/c%c/c++/?id=1&p=3
From the encode result, we can find there are not +, / and = in result.