C #에서 Base64 URL 안전 인코딩을 달성하고 싶습니다. Java Codec
에는 URL로 안전하게 인코딩 된 문자열을 제공 하는 공용 라이브러리 가 있습니다 . C #을 사용하여 어떻게 똑같이 할 수 있습니까?
byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes("StringToEncode");
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
위의 코드는이를 Base64로 변환하지만 ==
. URL 안전 인코딩을 달성하는 방법이 있습니까?
답변
URL에서 사용 하기 위해 단순히 알파벳 을 바꾸는 것이 일반적 이므로 % 인코딩이 필요하지 않습니다. 불과 3 65 개 문자는 문제가있다 – +
, /
하고 =
. 가장 일반적인 교체는 -
대신 +
하고 _
대신에 /
. 패딩에 관해서는 : 그냥 제거하십시오 ( =
); 필요한 패딩의 양을 추론 할 수 있습니다 . 다른 쪽 끝 : 프로세스를 반대로하십시오.
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes)
.TrimEnd(padding).Replace('+', '-').Replace('/', '_');
와:
static readonly char[] padding = { '=' };
그리고 반대로 :
string incoming = returnValue
.Replace('_', '/').Replace('-', '+');
switch(returnValue.Length % 4) {
case 2: incoming += "=="; break;
case 3: incoming += "="; break;
}
byte[] bytes = Convert.FromBase64String(incoming);
string originalText = Encoding.ASCII.GetString(bytes);
그러나 흥미로운 질문 은 “공통 코덱 라이브러리”가 사용하는 것과 동일한 접근 방식입니까? 테스트하는 것이 합리적 일 것입니다. 이것은 매우 일반적인 접근 방식입니다.
답변
Base64UrlEncoder
네임 스페이스의 클래스 를 사용할 수 있습니다 Microsoft.IdentityModel.Tokens
.
const string StringToEncode = "He=llo+Wo/rld";
var encodedStr = Base64UrlEncoder.Encode(StringToEncode);
var decodedStr = Base64UrlEncoder.Decode(encodedStr);
if (decodedStr == StringToEncode)
Console.WriteLine("It works!");
else
Console.WriteLine("Dangit!");
답변
ASP.NET Core를 사용하는 경우 또 다른 옵션은 Microsoft.AspNetCore.WebUtilities.WebEncoders.Base64UrlEncode
.
당신은 ASP.NET 코어를 사용하지 않는 경우 소스는 언더로 볼 수 있습니다 아파치 2.0 라이센스 .WebEncoders
답변
여기에 몇 가지 성능 개선 사항에 대한 답변을 기반 으로 GitHub (MIT 라이선스) 에서 사용할 수 있는 소스 코드 를 사용하여 매우 사용하기 쉬운 url-safe base64 구현을 NuGet 에 게시했습니다 .
사용법은 다음과 같습니다.
var bytes = Encoding.UTF8.GetBytes("Foo");
var encoded = UrlBase64.Encode(bytes);
var decoded = UrlBase64.Decode(encoded);
답변
RFC4648에 따라 “base64url”이 아닌 URL 보안 base64와 유사한 인코딩을 얻으려면을 사용 System.Web.HttpServerUtility.UrlTokenEncode(bytes)
하여 인코딩 및
System.Web.HttpServerUtility.UrlTokenDecode(bytes)
디코딩합니다.
답변
가장 간단한 솔루션 : (패딩 없음)
private static string Base64UrlEncode(string input) {
var inputBytes = System.Text.Encoding.UTF8.GetBytes(input);
// Special "url-safe" base64 encode.
return Convert.ToBase64String(inputBytes)
.Replace('+', '-') // replace URL unsafe characters with safe ones
.Replace('/', '_') // replace URL unsafe characters with safe ones
.Replace("=", ""); // no padding
}
신용 이동 : Tholle
답변
다음은 Marc와 동일한 방식으로 인코딩 된 url-safe base64를 디코딩하는 또 다른 방법입니다. 나는 왜 4-length%4
일 했는지 모르겠다 .
다음과 같이 원점의 비트 길이 만 6과 8의 공배수이며 base64는 결과에 “=”를 추가하지 않습니다.
1 2 3 4 5 6 7 8|1 2 3 4 5 6 7 8|1 2 3 4 5 6 7 8
1 2 3 4 5 6|1 2 3 4 5 6|1 2 3 4 5 6|1 2 3 4 5 6
"==" "="
따라서 반대로 결과의 비트 길이를 8로 나눌 수 없으면 다음과 같이 추가 할 수 있습니다.
base64String = base64String.Replace("-", "+").Replace("_", "/");
var base64 = Encoding.ASCII.GetBytes(base64String);
var padding = base64.Length * 3 % 4;//(base64.Length*6 % 8)/2
if (padding != 0)
{
base64String = base64String.PadRight(base64String.Length + padding, '=');
}
return Convert.FromBase64String(base64String);