修正された base64 URL をデコード/エンコードするためのコード (ASP.NET Framework 内) 質問する

修正された base64 URL をデコード/エンコードするためのコード (ASP.NET Framework 内) 質問する

データを base64 でエンコードして URL に配置し、HttpHandler 内でデコードしたいと考えています。

私は発見したBase64 エンコーディング'/' 文字が許可されているため、UriTemplate のマッチングが台無しになります。その後、Wikipedia から「URL 用の修正 Base64」という概念があることを発見しました。

URL バリアント用に変更された Base64 が存在し、パディング '=' は使用されず、標準 Base64 の '+' と '/' 文字はそれぞれ '-' と '_' に置き換えられるため、URL エンコーダー/デコーダーを使用する必要がなくなり、エンコードされた値の長さに影響がなくなり、リレーショナル データベース、Web フォーム、および一般的なオブジェクト識別子で使用するために同じエンコード形式がそのまま残ります。

.NET を使用して、現在のコードを基本的な base64 エンコードとデコードから「URL 用に変更された base64」メソッドを使用するように変更したいと考えています。これを実行した人はいますか?

解読すると、次のような内容で始まることがわかります。

string base64EncodedText = base64UrlEncodedText.Replace('-', '+').Replace('_', '/');

// Append '=' char(s) if necessary - how best to do this?

// My normal base64 decoding now uses encodedText

ただし、末尾に 1 つまたは 2 つの「=」文字を追加する必要があり、少し複雑になります。

私のエンコードロジックはもう少しシンプルになるはずです:

// Perform normal base64 encoding
byte[] encodedBytes = Encoding.UTF8.GetBytes(unencodedText);
string base64EncodedText = Convert.ToBase64String(encodedBytes);

// Apply URL variant
string base64UrlEncodedText = base64EncodedText.Replace("=", String.Empty).Replace('+', '-').Replace('/', '_');

私はURL の Base64 ガイドStackOverflow エントリですが、長さがわかっているため、最後に必要な等号の数をハードコードできます。

ベストアンサー1

クラスもチェックHttpServerユーティリティUrlTokenEncode および UrlTokenDecode メソッドを使用して、URL セーフな Base64 エンコードとデコードを処理します。

注 1: 結果は有効な Base64 文字列ではありません。URL の安全でない文字の一部は置き換えられます。

注 2: 結果は RFC4648 の base64url アルゴリズムとは異なり、クエリ パラメータの値を安全にするために、等号をいくつ置き換えたかに応じて、'=' パディングを '0'、'1'、または '2' に置き換えます。

///<summary>
/// Base 64 Encoding with URL and Filename Safe Alphabet using UTF-8 character set.
///</summary>
///<param name="str">The origianl string</param>
///<returns>The Base64 encoded string</returns>
public static string Base64ForUrlEncode(string str)
{
    byte[] encbuff = Encoding.UTF8.GetBytes(str);
    return HttpServerUtility.UrlTokenEncode(encbuff);
}
///<summary>
/// Decode Base64 encoded string with URL and Filename Safe Alphabet using UTF-8.
///</summary>
///<param name="str">Base64 code</param>
///<returns>The decoded string.</returns>
public static string Base64ForUrlDecode(string str)
{
    byte[] decbuff = HttpServerUtility.UrlTokenDecode(str);
    return Encoding.UTF8.GetString(decbuff);
}

おすすめ記事