VB.NET密码解密时报System.FormatException:Base-64字符数组长度无效
触发
System.FormatException: 'Invalid length for a Base-64 char array or string.'的具体原因 该异常的核心触发逻辑是:传入Convert.FromBase64String方法的字符串,不满足标准Base64的格式要求(有效长度必须为4的整数倍,且仅包含Base64合法字符)。结合你给出的代码、存储的密文02FXthNUUZU=,代码和流程中存在的具体问题如下:
- 密文未做前置清理,携带了无效附加字符
现有解密逻辑仅实现了将字符串中的空格替换为+的操作,没有处理从Access数据库读取字符串时可能附带的首尾空格、回车、换行等不可见字符。比如原本12位的有效密文,如果取出时附带了1个前置空格,总长度变为13,不满足4的整数倍要求,就会直接触发格式异常。 - 数据库字段长度不足导致密文被截断
Base64编码规则要求最终字符串长度必须是4的整数倍,如果你在Access中用来存储密文的文本字段设置的长度过短,会直接截断加密生成的完整密文串。截断后的剩余字符串长度往往不满足4的整数倍要求,且可能缺失末尾用于补位的=符号,这也是这类场景下最常见的异常诱因。 - 重复的替换逻辑存在边界风险
你在解密函数的第一行已经执行了str = str.Replace(" ", "+"),后续调用Base64解析时又对处理后的字符串重复执行了一次相同的替换操作。虽然该逻辑本身不会直接造成错误,但如果替换过程误将其他非预期的空格(比如字符串中间的合法空白)替换为+,会引入Base64非法字符,间接触发解析异常。 - 存在无实际作用的冗余代码
解密函数中先定义了固定长度的字节数组Dim inputByteArray As Byte() = New Byte(str.Length - 1) {},紧接着就用Convert.FromBase64String的返回值覆盖了该数组,这段初始化逻辑完全没有实际价值,不会触发异常但容易造成逻辑混淆。
快速验证方式
你可以在调用Convert.FromBase64String之前,先将实际传入的字符串输出到控制台,查看其实际长度和内容:如果实际传入的字符串不是预期的12位有效密文(比如长度为11、13,或包含不可见字符),即可定位具体问题。
修复方向
- Base64解析前先对密文做标准化处理:先调用
str = str.Trim()清除首尾的空白和不可见字符,再执行空格替换为+的操作。 - 检查Access密文字段的长度设置,确保字段容量大于最长的加密密文长度,避免内容截断。
- 解析前增加长度校验逻辑:如果字符串长度不满足4的整数倍,自动在末尾补全
=符号直到满足长度要求,兼容等号被截断的场景。
内容的提问来源于stack exchange,提问作者Lasicak
相关产品推荐
相关产品推荐

