从base64字符串中删除等号是否可以?

ens*_*are 20 python base64 md5

我有一个字符串,我正在编码到base64以节省空间.如果我在最后删除等号,这是一个大问题吗?这会显着降低熵吗?我该怎么做才能确保生成的字符串的长度是固定的?

>>> base64.b64encode(combined.digest(), altchars="AB")
'PeFC3irNFx8fuzwjAzAfEAup9cz6xujsf2gAIH2GdUM='
Run Code Online (Sandbox Code Playgroud)

谢谢.

Bri*_*ian 18

您需要编码为Base64的每3个字节转换为4个ASCII字符,并使用'='字符填充结果,以便始终有4个编码字符的倍数.如果你有3个字节的确切倍数,那么你将没有等号.一个备用字节意味着最后会得到两个'='字符.两个备用字节意味着你在结尾处得到一个'='字符.根据您对字符串的解码方式,它可能会或可能不会将其视为有效字符串.使用您拥有的示例字符串,它不会解码,但我尝试过的一些简单字符串会解码.

您可以阅读此页面以更好地理解base64字符串和编码/解码.

http://www.nczonline.net/blog/2009/12/08/computer-science-in-javascript-base64-encoding/

您可以使用免费的在线编码器/解码器来检查输出字符串


Mar*_*lis 16

看看你的代码:

>>> base64.b64encode(combined.digest(), altchars="AB")
'PeFC3irNFx8fuzwjAzAfEAup9cz6xujsf2gAIH2GdUM='
Run Code Online (Sandbox Code Playgroud)

在base64中编码的字符串是被调用函数的结果digest().如果你的摘要函数产生固定长度值(例如,如果它正在计算MD5或SHA1摘要),那么b64encode的参数将始终是相同的长度.

如果以上是真的,那么你可以去除尾随等号,因为它们总是会有相同的数量.如果这样做,只需在解码前向字符串添加相同数量的等号.

如果摘要不是固定长度,则修剪等号不安全.

编辑:看起来您可能正在使用SHA-256摘要?SHA-256摘要是256位(或32字节).32个字节是10个3的组,加上剩下的2个.正如您将从Wikipedia部分中看到的填充 ; 这意味着你总是有一个尾随等于.如果它是SHA-256,那么剥离它是可以的,只要你记得在解码之前再次添加它.


Eli*_*ins 11

只要你知道他们做了什么,就可以删除等号.

Base64为其编码的每3个字节输出4个字符(换句话说,每个字符编码6位).添加填充字符,以便任何base64字符串始终是4的倍数,填充字符实际上不编码任何数据.(我不能确定为什么这样做 - 作为一种错误检查方式,如果字符串被截断,以便于解码,还是其他什么?).

在任何情况下,这意味着如果你有xbase64字符(无填充),将有4-(x%4)填充字符.(虽然x%4=1因为6和8的因子分解而永远不会发生).由于这些不包含任何实际数据,并且可以恢复,我经常在我想节省空间时将其删除,例如以下::

from base64 import b64encode, b64decode

# encode data
raw = b'\x00\x01'
enc = b64encode(raw).rstrip("=")

# func to restore padding
def repad(data):
     return data + "=" * (-len(data)%4)
raw = b64decode(repad(enc))
Run Code Online (Sandbox Code Playgroud)