如何通过使用Unix命令在base64和base64URL中编码和解码数据?

时间:2019-11-20 15:00:22

标签: shell encoding base64 decoding base64url

Base64编码可以通过

$ echo Some_data_to_be_converted | base64

U29tZV9kYXRhX3RvX2JlIF9jb252ZXJ0ZWQK

Base64解码可以通过

$ echo U29tZV9kYXRhX3RvX2JlIF9jb252ZXJ0ZWQK | base64 -d

Some_data_to_be_converted
  1. 如何实现Base64URL编码/解码?

  2. 是否足以将“ +”替换为“-”,将“ /”替换为“ _”?

  3. 何时执行填充“#”(添加/删除要考虑的“#”)?

2 个答案:

答案 0 :(得分:2)

这与@jps相同,但简短。还请记住,默认情况下,echo总是在末尾添加换行符,因此,要对其进行编码,必须添加-n

echo -n "Some_data_to_be_converted" | base64 | tr '/+' '_-' | tr -d '='

使用bulit-in bash工具将其解码回更为复杂,因为我没有找到一种简单的方法来用'='填充字符串,以便将长度除以4。可能可以使用{{1 }},但我没有深入研究。如果您有当地的红宝石,它将变得微不足道:

awk

答案 1 :(得分:1)

如果您已经有 base64编码字符串,则只需将“ +”替换为“-”,将“ /”替换为“ _”,以获得 base64url编码串。 为此,可以使用以下命令:

echo Some_data_to_be_converted | base64 | sed 's/+/-/g; s/\//_/g';

(您可以尝试Execute Bash Shell Online

Base64编码将输入字节(8位)映射为6位表示形式。 4个base64字符可以编码4 * 6 = 24位,等于3个字节。每当输入中的字节数不能除以3时,根据标准就需要填充。

填充字符为=

由于=字符用于URL中的键值对,因此,如果要在URL中使用编码值,则不能直接将其用于填充。您可以只忽略填充,因为大多数实现仍将起作用,并且只需忽略最后2或4个未使用的位即可。或者,如果接收方确实需要填充,则必须用URL安全表示形式=替换%3d