arrays - TextEncodings.Base64Url.Decode 与 Convert.FromBase64String

标签 arrays character-encoding base64 jwt

我正在努力创建一种可以生成 JWT token 的方法。该方法的一部分从我的 web.config 读取一个值,该值作为“ secret ”用于生成用于为 JWT token 创建签名的哈希值。

<add key="MySecret" value="j39djak49H893hsk297353jG73gs72HJ3tdM37Vk397" />

最初我尝试使用以下方法将“ secret ”值转换为字节数组。
byte[] key = Convert.FromBase64String(ConfigurationManager.AppSettings["MySecret"]);

但是,到达此行时引发了异常......

输入不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符或填充字符中的非法字符。

所以我查看了 OAuth 代码,因此使用另一种方法将 base64 字符串更改为字节数组
byte[] key = TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["MySecret"]);

这种方法没有问题。在我看来,他们似乎在做同样的事情。将 Base64 文本值更改为字节数组。但是,我一定错过了一些东西。为什么Convert.FromBase64String失败和 TextEncodings.Base64Url.Decode工作?

最佳答案

当我将我们的身份验证服务迁移到 .NET Core 时,我遇到了同样的事情。我查看了我们之前实现中使用的库的源代码,区别实际上在于名称本身。

TextEncodings 类有两种类型的文本编码器,Base64TextEncoder 和 Base64UrlEncoder .后者稍微修改了字符串,因此可以在 url 中使用 base64 字符串。

我的理解是quite common用 - 和 _ 替换 + 和/。事实上,我们一直在用我们的握手 token 做同样的事情。此外,末尾的填充字符也可以删除。这给我们留下了以下实现( this is from the source code ):

public class Base64UrlTextEncoder : ITextEncoder
{
    public string Encode(byte[] data)
    {
        if (data == null)
        {
            throw new ArgumentNullException("data");
        }

        return Convert.ToBase64String(data).TrimEnd('=').Replace('+', '-').Replace('/', '_');
    }

    public byte[] Decode(string text)
    {
        if (text == null)
        {
            throw new ArgumentNullException("text");
        }

        return Convert.FromBase64String(Pad(text.Replace('-', '+').Replace('_', '/')));
    }

    private static string Pad(string text)
    {
        var padding = 3 - ((text.Length + 3) % 4);
        if (padding == 0)
        {
            return text;
        }
        return text + new string('=', padding);
    }
}

关于arrays - TextEncodings.Base64Url.Decode 与 Convert.FromBase64String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41685931/

相关文章:

javascript - 在 Oracle 数据库中插入 Signature-Pad

c - 动态矩阵作为函数的静态参数

c++ - 如何创建一个 2MB 的数组或 vector 并用随机整数填充它

java - 从 Tomcat Servlet 中读取韩文字符

php - 中文字符在数据库中以空白结尾

python - 使用 Python 解析包含来自 AWS Lambda 的图像的 Base64 编码数据

arrays - 多模式匹配算法

c++ - std::数组对齐

google-chrome-extension - Chrome 说我的内容脚本不是 UTF-8

node.js - 如何使用 AJAX 将 Base64 图像发送或流式传输到 Node.js Express 服务器?