बेस # 64 सुरक्षित URL को C # में कैसे प्राप्त करें?


105

मैं C # में Base64 URL सुरक्षित एन्कोडिंग प्राप्त करना चाहता हूं। जावा में, हमारे पास सामान्य Codecपुस्तकालय है जो मुझे एक URL सुरक्षित एन्कोडेड स्ट्रिंग देता है। मैं C # का उपयोग करके इसे कैसे प्राप्त कर सकता हूं?

byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes("StringToEncode");
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);

उपरोक्त कोड इसे Base64 में कनवर्ट करता है, लेकिन यह पैड है ==। क्या URL सुरक्षित एन्कोडिंग प्राप्त करने का कोई तरीका है?


क्या आप केवल Url.Encodeस्ट्रिंग में उपयोग नहीं कर सकते BASE64?

C # में किस नामस्थान Url वर्ग मौजूद है?
विश्वेश फडनीस

एक नज़र डालें: msdn.microsoft.com/en-us/library/… आपको System.Webविधानसभा को संदर्भित करने की आवश्यकता है ।

यह =% 3 डी में परिवर्तित हो रहा है। मैं ऐसा नहीं चाहता।
विश्वेश फडनीस

3
तो आपका क्या मतलब है url safe? %3Durl सुरक्षित है

जवाबों:


182

यह केवल यूआरएल में उपयोग के लिए वर्णमाला स्वैप करने के लिए आम है , ताकि कोई भी% -encoding आवश्यक न हो; केवल 65 पात्रों में से 3 समस्याग्रस्त हैं - +, /और =। सबसे आम प्रतिस्थापन के -स्थान पर +और _इसके स्थान पर हैं /। पैडिंग के लिए: बस इसे हटा दें ( =); आप की जरूरत पैडिंग की मात्रा का अनुमान लगा सकते हैं । दूसरे छोर पर: प्रक्रिया को उल्टा करें:

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

हालांकि, दिलचस्प सवाल यह है: क्या यह वही दृष्टिकोण है जो "सामान्य कोडेक लाइब्रेरी" का उपयोग करता है? यह निश्चित रूप से परीक्षण करने के लिए एक उचित पहली बात होगी - यह एक बहुत ही सामान्य दृष्टिकोण है।


1
कॉमन कोडेक में वे यूआरएल सुरक्षित मोड के लिए [0-9a-zA-Z_-] चरित्र का उपयोग कर रहे हैं।
विश्वेश फडनीस

इसका उल्लेख URL अनुप्रयोगों के अंतर्गत Base64 के विकी पृष्ठ में भी किया गया है। en.wikipedia.org/wiki/Base64
विजेता

2
आपके पास यह फ़ंक्शन ' stackoverflow.com/questions/1886686/… ' भी है जो आपके लिए पूरी मेहनत करता है।
Toy4fun

1
हमें आवश्यकता क्यों नहीं है: केस 1: इनकमिंग + = "==="; टूटना; ?
एलेक्स दा फ्रैंका

5
@alexdafranca क्योंकि इसमें लंबाई 4 से 4 की नहीं होगी। 3x8 बिट्स 4x6 बिट्स बन जाती हैं (और चुने गए वर्णमाला में प्रत्येक 6 बिट्स 64 वर्णों में से एक है), 0x8 बिट्स को एन्डिंग के बिना 0x6 बिट्स के रूप में एन्कोड किया गया है, 1x8 बिट्स एन्कोडेड है ==पैडिंग के साथ 2x6 बिट्स , 2x8 को =पैडिंग के साथ 3x6 के रूप में एन्कोड किया गया है , 3x8 को पैडिंग के बिना 4x6 के रूप में एन्कोड किया गया है और फिर इसे संरेखित किया गया है इसलिए यह दोहराता है। कुछ भी कभी भी 1x6 बिट्स को एन्कोड नहीं किया जाता है, इसलिए आपको कभी भी ===पैडिंग की आवश्यकता नहीं है ।
जॉर्ज हेलेर

83

आप 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!");

1
यह स्वीकृत उत्तर की तुलना में बहुत साफ है। कोई नकारात्मक पक्ष?
taktak004

18
बस एक नोट: Microsoft.IdentityModel.Tokens एक NuGet पैकेज है जिसे डाउनलोड करना होगा।
उबेर श्नोकोज

मैं नाम से मान रहा हूं कि यह क्रॉस प्लेटफॉर्म नहीं है। क्या यह मामला है?
ब्रैंडन एस।


8

कुछ प्रदर्शन में सुधार के साथ यहां जवाबों के आधार पर, हमने NuGet के लिए GitHub (MIT लाइसेंस प्राप्त) पर उपलब्ध स्रोत कोड के साथ url-safe base64 कार्यान्वयन का उपयोग करना बहुत आसान है ।

उपयोग जितना आसान है

var bytes = Encoding.UTF8.GetBytes("Foo");
var encoded = UrlBase64.Encode(bytes);
var decoded = UrlBase64.Decode(encoded);

अद्भुत धन्यवाद। ब्याज तुम क्यों का विकल्प चुना है से बाहर "string".Replaceके लिए encodeविधि है, लेकिन के लिए मैनुअल की जगह के साथ एक पाश decode?
10 ᴍᴀᴛᴛ

@ some मुझे इसे फिर से देखने और कुछ बेंचमार्क चलाने की आवश्यकता है, लेकिन यह इसलिए है क्योंकि हम बाद में जोड़ते हैं इसलिए इसे अपरिवर्तनीय स्ट्रिंग के बजाय वर्णों की बढ़ती सूची द्वारा दर्शाया जाता है।
महमूद अल-कुद्सी

वापसी के साथ एक और वर्ग = स्ट्रिंग इसके बजाय: github.com/vndevpro/altecture-common/blob/master/…
hazjack

8

URL- सुरक्षित बेस 64-जैसे एन्कोडिंग प्राप्त करने के लिए, लेकिन RFC4648 के अनुसार "बेस 64url" नहीं, System.Web.HttpServerUtility.UrlTokenEncode(bytes)एनकोड करने के लिए उपयोग करें, और System.Web.HttpServerUtility.UrlTokenDecode(bytes)डीकोड करने के लिए।


6
यह RFC4648 के अनुसार URL-सुरक्षित Base64 एन्कोडिंग के अनुरूप मानकों को प्रदान नहीं करता है। इस प्रश्नोत्तर को भी देखें । सावधानी से प्रयोग करें।
आर्टजोम बी।

1

सबसे सरल समाधान: (बिना पैडिंग के)

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
  }

इसका श्रेय जाता है: थोल को


0

यहां url-safe base64 को डिकोड करने की एक और विधि है जिसे उसी तरह से मार्क के साथ एनकोड किया गया था। मुझे अभी नहीं पता कि क्यों 4-length%4काम किया (यह करता है)।

निम्नानुसार, केवल मूल की बिट की लंबाई 6 और 8 के सामान्य गुण हैं, आधार 6 परिणाम के लिए "=" को जोड़ नहीं देता है।

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

0

UWP में Microsoft क्रिप्टोग्राफिक इंजन का उपयोग करना।

uint length = 32;

IBuffer buffer = CryptographicBuffer.GenerateRandom(length);
string base64Str = CryptographicBuffer.EncodeToBase64String(buffer)
                   // ensure url safe
                   .TrimEnd('=').Replace('+', '-').Replace('/', '_');

return base64Str;

0

करणवीर कंग का जवाब एक अच्छा है और मैंने इसके लिए मतदान किया। हालांकि, यह स्ट्रिंग के अंत में एक विषम चरित्र छोड़ता है (हटाए गए पैडिंग वर्णों की संख्या का संकेत)। यहाँ मेरा समाधान है।

var bytesToEncode = System.Text.Encoding.UTF8.GetBytes("StringToEncode"); 
var bytesEncodedPadded = HttpServerUtility.UrlTokenEncode(bytesToEncode);
var objectIdBase64 = bytesEncodedPadded.Substring(0, bytesEncodedPadded.Length - 1);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.