从一个base64字符串中移除等号符号是否可以?

2024-05-12 18:42:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串要编码成base64以节省空间。我去掉结尾的等号有什么大不了的吗?这会显著降低熵吗?如何确保生成的字符串的长度是固定的?

>>> base64.b64encode(combined.digest(), altchars="AB")
'PeFC3irNFx8fuzwjAzAfEAup9cz6xujsf2gAIH2GdUM='

谢谢。


Tags: 字符串编码ab结尾空间digestbase64combined
3条回答

查看代码:

>>> base64.b64encode(combined.digest(), altchars="AB")
'PeFC3irNFx8fuzwjAzAfEAup9cz6xujsf2gAIH2GdUM='

在base64中编码的字符串是名为digest()的函数的结果。如果digest函数产生固定长度值(例如,如果它计算MD5或SHA1 digest),那么b64encode的参数将始终是相同的长度。

如果以上是真的,那么可以去掉后面的等号,因为它们的数目总是相同的。如果这样做,只需在解码前在字符串中附加相同数量的等号。

如果摘要不是固定的长度,那么修剪等号是不安全的。

编辑:您可能正在使用SHA-256摘要?SHA-256摘要是256位(或32字节)。32字节是10组3,加上2个剩余字节。从Wikipedia section on padding中可以看出,这意味着您总是有一个尾随的等于。如果是SHA-256,那么可以去掉它,只要你记得在解码之前再加一次就行了。

去掉等号是可以的,只要你知道它们的作用。

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))

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

为了更好地理解base64字符串和编码/解码,您可以阅读本页。

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

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

相关问题 更多 >