문제

Base64를 인코딩하여 데이터를 URL에 넣은 다음 httphandler 내에서 디코딩하고 싶습니다.

나는 그것을 발견했다 Base64 인코딩 내 uritemplate 매칭을 엉망으로 만드는 '/'문자를 허용합니다. 그런 다음 Wikipedia의 "URL에 대한 수정 된 Base64"개념이 있음을 발견했습니다.

패딩 '='가 사용되지 않는 URL 변형에 대한 수정 된 Base64가 존재하고 표준 Base64의 '+'및 '/'문자는 각각 '-'및 '_'로 대체되어 URL 인코더/디코더를 사용합니다. 더 이상 필요하지 않으며 인코딩 된 값의 길이에 영향을 미치지 않으므로 관계형 데이터베이스, 웹 양식 및 객체 식별자에 일반적으로 사용하기에 동일한 인코딩 된 양식을 그대로 두십시오.

.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

그러나 조금 더 복잡해 보이는 끝에 하나 또는 두 개의 '='숯을 추가해야합니다.

인코딩 로직이 조금 더 간단해야합니다.

// 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 항목이지만 길이가 알려진 길이가 있으므로 끝에 필요한 동일한 부호의 수를 하드 코딩 할 수 있습니다.

도움이 되었습니까?

해결책

이것은 올바르게 패드해야합니다 :-

 base64 = base64.PadRight(base64.Length + (4 - base64.Length % 4) % 4, '=');

다른 팁

또한 수업을 확인하십시오 httpserverutility URL Safe Base64 인코딩 및 디코딩을 처리하는 UrltokenenCode 및 UrltokendeCode 메소드를 사용합니다.

참고 1 : 결과는 유효한 Base64 문자열이 아닙니다. URL의 안전하지 않은 문자가 대체됩니다.

참고 2 : 결과는 RFC4648의 Base64URL 알고리즘과 다릅니다.

///<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);
}

댓글을 달 수있는 포인트는 충분하지 않지만 도움이되는 경우 제공된 링크에서 찾은 Sushil (JSON Web Signature IETF Draft)이 URL의 매개 변수로서 Base 64를 인코딩 할 때 작동합니다.

게으른 사람들을 위해 아래에서 복사 한 스 니펫 :

    static string Base64UrlEncode(byte[] arg)
    {
        string s = Convert.ToBase64String(arg); // Regular base64 encoder
        s = s.Split('=')[0]; // Remove any trailing '='s
        s = s.Replace('+', '-'); // 62nd char of encoding
        s = s.Replace('/', '_'); // 63rd char of encoding
        return s;
    }

    static byte[] Base64UrlDecode(string arg)
    {
        string s = arg;
        s = s.Replace('-', '+'); // 62nd char of encoding
        s = s.Replace('_', '/'); // 63rd char of encoding
        switch (s.Length % 4) // Pad with trailing '='s
        {
            case 0: break; // No pad chars in this case
            case 2: s += "=="; break; // Two pad chars
            case 3: s += "="; break; // One pad char
            default: throw new System.Exception(
              "Illegal base64url string!");
        }
        return Convert.FromBase64String(s); // Standard base64 decoder
    }

질문에서 설명한 바와 같이 Base64와 거의 다른 Base64Url 인코딩을 인코딩/디코딩 할 코드를 찾는 동안 여기에 쳤다.

이 문서에서 C# 코드 스 니펫을 찾았습니다. JSON 웹 서명 IETF 드래프트

받아 들여진 답변과 비교할 때 다음은 근본적으로 어떻게 풀다 C#을 사용하여 Base64 인코딩 된 URL :

풀다:

string codedValue = "base64encodedUrlHere";

string decoded;
byte[] buffer =  Convert.FromBase64String(codedValue);
decoded = Encoding.UTF8.GetString(buffer);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top