什么是url-safe和文件名安全的base64的最佳候选填充字符?

时间:2009-03-18 19:20:29

标签: encoding base64 padding

官方base64的填充字符为'=',在URL中使用时可能需要进行百分比编码。我正在尝试找到最好的填充字符,以便我的编码字符串可以是url安全的(我将使用编码的字符串作为参数值,例如id = encodedString)和文件名安全(我将使用编码字符串直接作为文件名)。

Dot('。')是一个受欢迎的候选人,它的网址是安全的,但它并不完全是文件名安全的:Windows won't allow a file name which ends with a trailing dot

'!'似乎是一个可行的选择,虽然我用Google搜索,我从未见过任何人使用它作为填充字符。有任何想法吗?谢谢!

更新:我将“+”替换为“ - ”(减号)并在我的自定义base64编码中将“/”替换为“_”(下划线),因此' - '或'_ '不再适用于填充字符。

4 个答案:

答案 0 :(得分:4)

最好的解决方案(我上个月用电子邮件发送网站处理这个问题)是不要使用填充字符(=)

填充字符存在的唯一原因是“懒惰”解码器。你可以非常轻松地添加缺失= - >只需在文本上执行%4并从4中减去你得到的数字,这就是你需要在字符串结尾添加的数量。这是C#代码:

    var pad = 4 - (text.Length % 4);
    if (pad < 4)
        text = text.PadRight(text.Length + pad, '=');

此外,大多数这样做的人都有兴趣用其他URL安全字符替换+和/ ...我建议:

  • 替换为 - /替换为_

请勿使用。因为它可以在不同的系统/ Web服务器上产生疯狂的结果(例如,IIS Base64编码的字符串不能以。或IIS将搜索文件结束)

答案 1 :(得分:2)

URI中的RFC 2396无保留字符为:

"-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"

值得指出的是,微软的文章也说“不要假设区分大小写”。也许你应该坚持使用16或32?

答案 2 :(得分:1)

Wikipedia文章指出;

  

用于URL变体的修改后的Base64   存在,没有填充'='   使用

答案 3 :(得分:0)

我会选择' - '或'_' 它们是URL和文件安全的,它们看起来或多或少像填充