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个字节.这两个相等的符号不会向字符串添加任何信息,并且可以在存储时丢弃.
根据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 位在 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)
归档时间: |
|
查看次数: |
38839 次 |
最近记录: |