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

时间:2012-01-26 15:21:40

标签: python base64 md5

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

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

感谢。

6 个答案:

答案 0 :(得分:17)

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

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

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

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

答案 1 :(得分:14)

查看您的代码:

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

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

如果上述情况属实,则可以删除尾随等号,因为它们的数量始终相同。如果这样做,只需在解码前向字符串添加相同数量的等号。

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

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

答案 2 :(得分:9)

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

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

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

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

答案 3 :(得分:1)

那些是填充,你不会通过删除它们节省太多,因为最多有两个,所以如果你想节省空间,看看其他地方。通过引用熵你压缩这些base64字符串?如果是这样,即使你删除它们,它们也不会对压缩大小产生太大影响。

答案 4 :(得分:1)

除了@Martin Ellis指出的情况之外,弄乱填充字符会导致获得

TypeError: Incorrect padding

并且当你在它的时候产生一些垃圾。

如@MattH所述,base64将与节省空间相反。

要节省空间,您应该应用压缩算法,例如zlib。

例如,zlib

import zlib

s = '''large string....'''
compressed = zlib.compress(s)

compression_ratio = len(s)*1.0/len(compressed)    

# And later...
out = zlib.decompress(compressed) 

# The above function is also good for relieving stress.

答案 5 :(得分:0)

我不这么认为。 http://en.wikipedia.org/wiki/Base64#Padding

这些等于“有用”