MD5哈希和Base64编码

Joa*_*les 16 hash base64 md5 cryptography cryptographic-hash-function

如果我有一个32个字符的字符串(MD5哈希)并使用Base64对其进行编码,那么编码字符串的最大长度是多少?

Tho*_*ght 41

在Base64表示法中,MD5值始终为22(有用)字符长.在编码MD5哈希时,许多Base64算法还会附加2个填充字符,使总数达到24个字符.填充不会添加任何有用的信息,可以丢弃.只有前22个字符很重要.

原因如下:

MD5哈希值是128位值.Base64字符串中的每个字符都包含6位信息,因为该字符有64个可能值,并且需要6个2的幂才能达到64.每个字符中有6位信息,21个字符有126位信息, 22个字符包含132位信息.由于128位不能容纳在21个字符内,但确实适合22个字符(有一点空间),128位值总是在Base64中表示为22个字符.

关于填充的注释:

我在上面提到过,许多Base64编码算法在编码MD5值时会添加几个填充字符.这是因为Base64将3个字节的信息表示为4个字符.由于MD5具有16个字节的信息,因此许多Base64编码算法附加"=="以指定16字节的输入比3的下一个倍数短2个字节,这将是18个字节.这两个相等的符号不会向字符串添加任何信息,并且可以在存储时丢弃.


Ara*_*tor 9

根据http://en.wikipedia.org/wiki/Base64

"注意,给定n个字节的输入,输出将是(n + 2 - ((n + 2)%3))/ 3*4字节长,对于大n,它会收敛到n*4/3或1.33333n ".

因此,它将是((32 + 2 - (32 + 2)%3))/ 3*4 = 34 - (34%3)/ 3*4 =(34 - 1)/ 3*4 = 33/3*4 = 44个字符.

您可以始终以原始二进制形式(128位)提取它并将其直接编码到base 64中,这意味着转换16个字节而不是32个字节,当基本64编码时,它变为24个字节.

  • md5散列是128位,可编码为24个base64字符. (5认同)
  • 在base64中编码十六进制编码的哈希输出实际上没有意义 - 十六进制序列中的有效字符是base64序列中的有效字符的子集. (2认同)
  • @caf,但是解码十六进制然后用 Base64 重新编码是有意义的......编码字符串的大小会更小 (2认同)

Bru*_* Zu 5

MD5 128 位在 Base64 中表示为 22 个字符。在这种情况下还有 2 个填充字符“=”。

如何?

$ md5sum ./README.md 
c6b5f48774aa0a87a82a276ff86be507  ./README.md
$ md5sum ./README.md | base64
YzZiNWY0ODc3NGFhMGE4N2E4MmEyNzZmZjg2YmU1MDcgIC4vUkVBRE1FLm1kCg==
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Base64编码的字符串不短于MD5哈希长度

因为编码的是MD5哈希的存储形式。不是 MD5 哈希值本身。

需要注意的是用多少位来存储一位MD5哈希值。

正确的方法:

转换哈希值所以1将十六进制转换为二进制

2 将二进制转换为base64编码的字符串

$ md5sum ./README.md 
c6b5f48774aa0a87a82a276ff86be507  ./README.md
$ md5sum ./README.md | base64
YzZiNWY0ODc3NGFhMGE4N2E4MmEyNzZmZjg2YmU1MDcgIC4vUkVBRE1FLm1kCg==
Run Code Online (Sandbox Code Playgroud)

或者

$ cat ./README.md |  openssl dgst -md5 
c6b5f48774aa0a87a82a276ff86be507
$ cat ./README.md |  openssl dgst -md5 -binary | openssl enc -base64
xrX0h3SqCoeoKidv+GvlBw==
Run Code Online (Sandbox Code Playgroud)