سؤال

أرغب في تشفير البيانات باستخدام base64 لوضعها في عنوان URL ثم فك تشفيرها داخل HttpHandler الخاص بي.

لقد وجدت ذلك ترميز Base64 يسمح بحرف "/" مما سيؤدي إلى إفساد مطابقة UriTemplate الخاصة بي.ثم وجدت أن هناك مفهوم "تعديل Base64 لعنوان URL" من ويكيبيديا:

يوجد Base64 معدل لمتغير عنوان URL، حيث لن يتم استخدام الحشو '='، ويتم استبدال الأحرف '+' و'/' الخاصة بـ Base64 القياسي على التوالي بـ '-' و'_'، بحيث يمكن استخدام برامج تشفير/فك تشفير URL لم يعد ضروريًا وليس له أي تأثير على طول القيمة المشفرة، مما يترك نفس النموذج المشفر سليمًا للاستخدام في قواعد البيانات العلائقية ونماذج الويب ومعرفات الكائنات بشكل عام.

باستخدام .NET، أريد تعديل الكود الحالي الخاص بي من إجراء تشفير وفك تشفير base64 الأساسي إلى استخدام طريقة "base64 المعدلة لعنوان URL".وقد فعل أي شخص هذا؟

لفك التشفير، أعلم أن الأمر يبدأ بشيء مثل:

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('/', '_');

لقد رأيت دليل إلى Base64 لعنوان URL إدخال StackOverflow، ولكن له طول معروف وبالتالي يمكنهم ترميز عدد العلامات المتساوية المطلوبة في النهاية.

هل كانت مفيدة؟

المحلول

وهذا ما يجب أن لوح بها بشكل صحيح: -

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

نصائح أخرى

تحقق أيضًا من الفصل HttpServerUtility باستخدام أساليب UrlTokenEncode وUrlTokenDecode التي تتعامل مع تشفير وفك تشفير Base64 الآمن لعنوان URL.

ملاحظة 1:النتيجة ليست سلسلة Base64 صالحة.تم استبدال بعض الأحرف غير الآمنة لعنوان URL.

ملاحظة 2:تختلف النتيجة عن خوارزمية base64url في RFC4648.

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

وليس ما يكفي من النقاط للتعليق، ولكن في حالة أنه يساعد، إلى مقتطف الشفرة الذي سوشيل وجدت في الرابط المقدم (JSON الويب التوقيع مشروع IETF) يعمل لعند ترميز قاعدة 64 كمعلمة في URL.

ونسخها المتكررة أدناه للحصول على تلك التي هي كسول:

    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
    }

وأنا ضربت هنا بينما كانوا يبحثون عن رمز للقيام ترميز / فك الترميز base64url الذي يختلف قليلا من base64 في كما هو موضح في هذه المسألة.

وجدت قصاصة ج # رمز في هذه الوثيقة. JSON الويب التوقيع مشروع IETF

بالمقارنة مع الإجابة المقبولة، إليك الطريقة الأساسية فك تشفير عنوان URL مشفر بـ base64، باستخدام C#:

فك تشفير:

string codedValue = "base64encodedUrlHere";

string decoded;
byte[] buffer =  Convert.FromBase64String(codedValue);
decoded = Encoding.UTF8.GetString(buffer);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top