根据我的理解,base64编码的字符串(即编码的输出)必须始终是4的倍数。
c#Convert.FromBase64String表示其输入必须是4的倍数
但是如果我给它一个25个字符的字符串就不会抱怨
[convert]::FromBase64String("ei5gsIELIki+GpnPGyPVBA==")
[convert]::FromBase64String("1ei5gsIELIki+GpnPGyPVBA==")
两个都工作。 (第一个是24,第二个是25)
[convert]::FromBase64String("11ei5gsIELIki+GpnPGyPVBA==")
因无效长度异常而失败
我认为这是c#库中的一个错误,但我只想确保 - 我正在编写代码来嗅探字符串,看看它们是否是有效的base64字符串,我想确定我理解的是有效的字符串看起来像(一个可能的实现是将字符串提供给system.convert并查看它是否抛出 - 为什么要重新发明完美的代码)
答案 0 :(得分:3)
是的,这是一个漏洞(又名bug)。由于在名为FromBase64_ComputeResultLength()的内部辅助函数中进行了perf优化,它计算了byte []结果的长度。它有这个评论(编辑适合):
// For legal input, we can assume that 0 <= padding < 3. But it may be
// more for illegal input.
// We will notice it at decode when we see a '=' at the wrong place.
“我们会注意到”这句话并不完全准确,解码器会标记一个'=',如果没有预期,但它无法检查是否有太多。 25-char字符串就是这种情况。
您可以在connect.microsoft.com上报告问题,我没有看到类似它的现有报告。请注意,微软很可能不会很快实际修复它,因为更改将破坏现在成功解析错误的base64字符串的现有程序。它通常需要一个主要的.NET发布更新来摆脱这样的问题,就像它为.NET 4.0所做的那样,没有一个即将发布。
但是,是的,您的简单解决方法是检查字符串长度是否可以被4整除,使用%运算符。