【问题标题】:Convert.FromBase64String gives the error of "The input is not a valid Base-64 string"Convert.FromBase64String 给出“输入不是有效的 Base-64 字符串”的错误
【发布时间】:2022-01-05 18:31:52
【问题描述】:

这是我的字符串,我尝试将其从 base64 转换为人类可读的字符串:

eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9kYXRlb2ZiaXJ0aCI6IjIvMjUvMTk5MSAxMjowMDowMCBBTSIsIm5iZiI6MTY0MTQwNjk2MCwiZXhwIjoxNjQxNDEwNTYwLCJpc3MiOiJodHRwczovL2xvY2FsaG9zdDo3MDAwLyIsImF1ZCI6Imh0dHBzOi8vbG9jYWxob3N0OjcwMDAvIn0

它适用于从base64转换的在线网站,例如this site

在 c# .net6 上我试试这个代码:

var bytes = Convert.FromBase64String(base64payload);

base64payload 是上面那个字符串。 为什么我在 c# dotnet 6 上会出现此错误?

"The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters."

据我所知,(a-z A-Z 0-9 / +) 是有效的,我的眼睛在这个字符串中没有看到任何错误的 base64 字符 + 它适用于其他地方。

【问题讨论】:

  • 您收到错误是因为它无效。长度不能被 4 整除。它缺少一个填充字符。是什么产生的?
  • 我尝试手动拆分令牌中间声明部分。 var accessToken = context.AccessToken; var base64payload = accessToken.Split('.')[1];哪个访问令牌是实际令牌。
  • 您所链接的网站在解码时冒犯了。它忽略了您没有正确填充的事实。对于严格正确的 Base64 编码,它需要填充。无论产生什么,它都在去除填充物。您和生产者之间有一个隐含的约定,即假定填充,但这需要您先添加它,然后才能将它与符合该约定的东西一起使用,例如严格的解码器喜欢Convert.FromBase64String()
  • 字符串是 JWT 的有效负载部分。 JWT 使用 Base64Url 编码。 Base64Url 通常在没有填充的情况下工作,许多 base64 解码器对填充非常宽容。众所周知,.NET Base64 解码器是严格的。
  • 嗯,不,以前版本的 .NET 在这方面的表现并没有什么不同。 Convert.FromBase64String 一直对填充很严格。还有一些不同。

标签: c# base64 character converters .net-6.0


【解决方案1】:

您的字符串缺少一些填充。你可以检查那个here,如果你想修复它。

修复正确的字符串是:

eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9kYXRlb2ZiaXJ0aCI6IjIvMjUvMTk5MSAxMjowMDowMCBBTSIsIm5iZiI6MTY0MTQwNjk2MCwiZXhwIjoxNjQxNDEwNTYwLCJpc3MiOiJodHRwczovL2xvY2FsaG9zdDo3MDAwLyIsImF1ZCI6Imh0dHBzOi8vbG9jYWxob3N0OjcwMDAvIn0=

之后,使用以下代码:

using System;
using System.Text;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var coded = ("eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9kYXRlb2ZiaXJ0aCI6IjIvMjUvMTk5MSAxMjowMDowMCBBTSIsIm5iZiI6MTY0MTQwNjk2MCwiZXhwIjoxNjQxNDEwNTYwLCJpc3MiOiJodHRwczovL2xvY2FsaG9zdDo3MDAwLyIsImF1ZCI6Imh0dHBzOi8vbG9jYWxob3N0OjcwMDAvIn0=");
            string inputStr = Encoding.UTF8.GetString(Convert.FromBase64String(coded));
            Console.WriteLine(inputStr);

        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多