বেস-64৪ চর অ্যারের অবৈধ দৈর্ঘ্য


91

শিরোনাম হিসাবে, আমি পাচ্ছি:

বেস-64৪ চর অ্যারের অবৈধ দৈর্ঘ্য।

আমি এখানে এই সমস্যাটি সম্পর্কে পড়েছি এবং মনে হয় যে পরামর্শটি ভিউ স্টেটটি বড় হলে এটি এসকিউএল এ সঞ্চয় করতে হবে। আমি খুব ভাল ডেটা সংগ্রহের সাথে একটি উইজার্ড ব্যবহার করছি যাতে আমার ভিউস্টেটটি বড়। তবে, আমি "স্টোর-ইন-ডিবি" সমাধানটি ঘুরিয়ে দেওয়ার আগে, কেউ আমার দিকে নজর দিতে পারে এবং আমার কাছে অন্য বিকল্প আছে কিনা তা বলতে পারেন?

আমি নীচের পদ্ধতিটি ব্যবহার করে প্রসবের জন্য ইমেলটি তৈরি করি:

public void SendEmailAddressVerificationEmail(string userName, string to)
{
    string msg = "Please click on the link below or paste it into a browser to verify your email account.<BR><BR>" +
                    "<a href=\"" + _configuration.RootURL + "Accounts/VerifyEmail.aspx?a=" +
                    userName.Encrypt("verify") + "\">" +
                    _configuration.RootURL + "Accounts/VerifyEmail.aspx?a=" +
                    userName.Encrypt("verify") + "</a>";

    SendEmail(to, "", "", "Account created! Email verification required.", msg);
}

এনক্রিপ্ট পদ্ধতিটি দেখতে এমন দেখাচ্ছে:

public static string Encrypt(string clearText, string Password)
{

    byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(clearText);

    PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });


    byte[] encryptedData = Encrypt(clearBytes, pdb.GetBytes(32), pdb.GetBytes(16));

    return Convert.ToBase64String(encryptedData);
}

হটমেইলে এইচটিএমএল দেখতে কেমন তা এখানে রয়েছে:

আপনার ইমেল অ্যাকাউন্ট যাচাই করতে দয়া করে নীচের লিঙ্কটিতে ক্লিক করুন বা এটি একটি ব্রাউজারে আটকান।

HTTP: // লোকালহোস্ট: 1563 / অ্যাকাউন্ট / ভেরিফাইমেইল.এএসপিএক্স? এ = YOHY57xYRENEOu3H + FGq1Rf09AZAI56EPjfwuK8XWKg =

প্রাপ্তির শেষে, VerifyEmail.aspx.cs পৃষ্ঠায় লাইন রয়েছে:

 string username = Cryptography.Decrypt(_webContext.UserNameToVerify, "verify");

এখানে ব্যবহারকারীর নামটিও যাচাইকরণের জন্য প্রাপ্তি:

public string UserNameToVerify
{
    get
    {
        return GetQueryStringValue("a").ToString();
    }
}

এবং এখানে গেটিক্যুরিস্ট্রিংভ্যালু পদ্ধতিটি রয়েছে:

private static string GetQueryStringValue(string key)
{
    return HttpContext.Current.Request.QueryString.Get(key);
}

এবং ডিক্রিপ্ট পদ্ধতিটি দেখে মনে হচ্ছে:

public static string Decrypt(string cipherText, string password)
{

    **// THE ERROR IS THROWN HERE!!**
    byte[] cipherBytes = Convert.FromBase64String(cipherText);

এই ত্রুটিটি কোনও কোড ফিক্সের মাধ্যমে প্রতিকার করা যেতে পারে বা আমার কি ডেটাবেসে ভিউস্টেটটি সংরক্ষণ করতে হবে?

উত্তর:


205

একটি base64 এনকোড স্ট্রিং এর দৈর্ঘ্য সবসময় 4 একটি একাধিক যদি 4 একটি একাধিক নয়, তাহলে =এটা না হওয়া পর্যন্ত অক্ষর যোগ করা হয়। ফর্মটির একটি ক্যোরিয় স্ট্রিংয়ের ?name=valueসমস্যা valueরয়েছে যখন এতে =চ্যাটার থাকে (তাদের মধ্যে কিছু বাদ দেওয়া হবে, আমি সঠিক আচরণটি মনে করি না)। =বেস 64 ডিকোড করার আগে আপনি সঠিক সংখ্যার অক্ষর যুক্ত করে পালাতে সক্ষম হতে পারেন ।

সম্পাদনা 1

আপনি খুঁজে পেতে পারেন যে মান UserNameToVerifyকরেছেন ছিল "+"'এ পরিবর্তিত র " "s' এর তাই আপনি এখন ভালো কিছু করতে প্রয়োজন হতে পারে:

a = a.Replace(" ", "+");

এটি দৈর্ঘ্য ডান পাওয়া উচিত;

int mod4 = a.Length % 4;
if (mod4 > 0 )
{
    a += new string('=', 4 - mod4);
}

অবশ্যই কল করা UrlEncode(লূকএইচ এর উত্তর হিসাবে) এই সমস্ত বিভ্রান্ত করা উচিত।


9
ধন্যবাদ ব্র্যাড - এটি আসলে এই সামান্য কোডটিই কাজটি করেছিল: a = a.Replace ("", "+");
পিটার

4
@ কোড শেরপা: যদি এটি হয় তবে আপনার সেরা পছন্দটি স্ট্রিংটি প্রেরণের আগে urlencode করা এবং রসিদে urldecode ode অন্যথায় যদি অন্য একটি url উল্লেখযোগ্য অক্ষর আপনার স্ট্রিংয়ের মধ্যে আসে তবে আপনাকে অন্য একটি Replaceবিবৃতি যুক্ত করতে হবে । এনকোডিং এমন একটি কভারওয়্যার যা আপনাকে নির্বিশেষে সুরক্ষা দেয়।
ম্যাট এলেন

4
আপনি অনুরোধ প্যারামিটারগুলি ইতিমধ্যে এএসপি.নেট দ্বারা UrlDecoded হিসাবে প্রাপ্তিতে আপনার স্ট্রিংটি urlDecode করতে হবে না। প্রেরণের সময় আপনার অবশ্যই urlEncode করা উচিত।
bleeeah

অথবা আপনি একটি ইনলাইন সংস্করণ চাইলে: a = a + new string('=', (4 - a.Length % 4) % 4)আরএফসি 4648 ইউআরএল-নিরাপদ বেস 64 ডিকোড করার উদাহরণ :public string base64urlDecode(string encoded) { return System.Text.Encoding.UTF8.GetString(System.Convert.FromBase64String(encoded.Replace("_","/").Replace("-","+") + new string('=', (4 - encoded.Length % 4) % 4))); }
গ্রেগম্যাক

4
"আপনি আরলডিকোডে যাবেন না" - এটি! আমার কোডটি দিয়ে UrlDecodeপদক্ষেপ নেওয়ার সাথে সাথে আমি দেখতে পেলাম যে প্যারামিটারটি ইতিমধ্যে ডিকোড হয়েছে, সমস্যাটি আমাকে চালিয়ে যাচ্ছিল যার মধ্য দিয়ে চরিত্রগুলি সরিয়ে দেওয়া। ধন্যবাদ @ ম্যাটেলেন
জিজেকিএইচ

30

আমার অনুমান যে আপনি কোয়েরিস্ট্রিং এ অন্তর্ভুক্ত করার সময় আপনার বেস 64 স্ট্রিংটি কেবল ইউআরএল-এনকোড করা দরকার ।

বেস 64 এনকোডিং কিছু অক্ষর ব্যবহার করে যা অবশ্যই এনকোড করা উচিত যদি তারা কোনও ক্যোরিস্ট্রিংয়ের অংশ হয় (যেমন +এবং /এবং সম্ভবত =)। যদি স্ট্রিংটি সঠিকভাবে এনকোড করা না থাকে তবে আপনি এটিকে অন্য প্রান্তে সাফল্যের সাথে ডিকোড করতে পারবেন না, তাই ত্রুটি।

আপনি HttpUtility.UrlEncodeআপনার বেস 64 স্ট্রিংটি এনকোড করতে পদ্ধতিটি ব্যবহার করতে পারেন :

string msg = "Please click on the link below or paste it into a browser "
             + "to verify your email account.<br /><br /><a href=\""
             + _configuration.RootURL + "Accounts/VerifyEmail.aspx?a="
             + HttpUtility.UrlEncode(userName.Encrypt("verify")) + "\">"
             + _configuration.RootURL + "Accounts/VerifyEmail.aspx?a="
             + HttpUtility.UrlEncode(userName.Encrypt("verify")) + "</a>";

ধন্যবাদ শুধু আপনার পরামর্শের লুক চেষ্টা করেছিলেন কিন্তু যে কাজ :( না।
পিটার

@ শেরপা - এটি কাজ করে চলুন, সমস্যাটি অবশ্যই অবশ্যই পিছনের =চরিত্রগুলির সাথে।

লুক - আমার মনে হয়েছে আপনি ঠিক আছেন। বাড়িতে এটি চেষ্টা করবে। ধন্যবাদ একটি বান্ডিল এফওয়াইআই - আমি আমার মূল পোস্টে আমার হটমেইল ইনবক্সে স্ট্রিংটি দেখতে কেমন তা জুড়েছি।
পিটার

চাচা ব্র্যাড ঠিক বলেছেন, গত সপ্তাহে আমারও একই সমস্যা ছিল এবং সমস্যাটি ছিল একটি পিছনের "=" অক্ষর _
মারকোট

10

আমি এখনও আপগোট করতে বা মন্তব্য করার মতো যথেষ্ট নামী নন, তবে লূকএইচ-এর উত্তর আমার পক্ষে স্পষ্ট ছিল।

যেহেতু এখন এসইএস এনক্রিপশনটি ব্যবহারের মান, তাই এটি একটি বেস 64 স্ট্রিং তৈরি করে (কমপক্ষে সমস্ত এনক্রিপ্ট / ডিক্রিপ্ট প্রয়োগ আমি দেখেছি)। এই স্ট্রিংটির দৈর্ঘ্য 4 টির গুণমান (স্ট্রিং দৈর্ঘ্য% 4 = 0)

আমি যে স্ট্রিংগুলি শুরু এবং শেষের দিকে + এবং = ধারণ করেছিলাম এবং যখন আপনি কেবল এটি ইউআরএল এর ক্যোয়ারিং স্ট্রিংয়ের সাথে যুক্ত করেছেন, তখন এটি ডানদিক দেখায় (উদাহরণস্বরূপ, আপনি যে ইমেলটি তৈরি করেন) তবে লিঙ্কটি অনুসরণ করা হয় এবং .NET পৃষ্ঠাগুলি এটি পুনরুদ্ধার করে এবং এটিকে .ুকিয়ে দেয় age পৃষ্ঠা RRequest.QueryString, সেই বিশেষ অক্ষরগুলি চলে যাবে এবং আপনার স্ট্রিংয়ের দৈর্ঘ্য 4 এর একাধিক হবে না।

স্ট্রিংয়ের (এফআরটি: +) এর এফআরন্টে বিশেষ অক্ষর যেমন রয়েছে, তেমনি = শেষে, আপনি কিছুটা যুক্ত করতে পারবেন না - আপনি সাইফার পাঠ্যটিকে এমনভাবে পরিবর্তন করছেন যেভাবে কিছুটা আলাদা করা যায় না মূল ক্যোরিস্ট্রিংয়ে আসলে কী ছিল তা মেলে না।

সুতরাং, এইচটিপিটিউটিটি.আরল্যানকোড (এইচটিএমএল এনকোড নয়) দিয়ে সাইফার পাঠ্য মোড়ানো, অ-অক্ষরীয় অক্ষরকে এমনভাবে রূপান্তরিত করে যা নিশ্চিত করে। নেট যখন কোয়েরিস্ট্রিং সংকলনে ব্যাখ্যা করা হয় তখন নেট তাদেরকে তাদের মূল অবস্থায় ফেরত দেয়।

ভাল জিনিসটি হ'ল, ইউআরএল-এর জন্য ক্যোরিস্ট্রিং তৈরি করার সময় আমাদের কেবল ইউআরএলএনকোড করা দরকার। আগত দিকে, এটি স্বয়ংক্রিয়ভাবে মূল স্ট্রিংয়ের মানটিতে আবার অনুবাদ করা হবে।

এখানে কিছু উদাহরণ কোড

string cryptostring = MyAESEncrypt(MySecretString);
string URL = WebFunctions.ToAbsoluteUrl("~/ResetPassword.aspx?RPC=" + HttpUtility.UrlEncode(cryptostring));

6

ডেটা না জেনে আমার প্রাথমিক অনুমানটি হ'ল ইউজারনেমটোভেরিফাই দৈর্ঘ্যে 4 এর একাধিক নয়। পরীক্ষা করে দেখুন FromBase64String MSDN উপর।

// Ok
byte[] b1 = Convert.FromBase64String("CoolDude");
// Exception
byte[] b2 = Convert.FromBase64String("MyMan");

ধন্যবাদ SwDevMan81। এখনই কাজ ছেড়ে যাচ্ছেন তবে আজ রাতের পরের দিকে এটি চেষ্টা করে দেখবেন। আপনার সাহায্যের জন্য ধন্যবাদ.
পিটার

কোনও সমস্যা নেই,
ফিক্সটি

ধন্যবাদ আবার SwDevMan81। আমি এটি একবার দেখুন। আমি আমার মূল পোস্টে (এফওয়াইআই) ইউজারনেমটোভ্যারিফাই পোস্ট করেছি। ঠিক আছে ... এখন আমার সত্যিই যেতে হবে বা আমি আসল বসকে নিয়ে সমস্যায়
পিটার

: এই পোস্টে মত দেখায় পাশাপাশি সাহায্য করতে পারে stackoverflow.com/questions/1392970/...
SwDevMan81

1

এনক্রিপ্ট করা স্ট্রিংটিতে দুটি বিশেষ অক্ষর ছিল +এবং =

'+' চিহ্নটি ত্রুটিটি দিচ্ছিল, সুতরাং নীচের সমাধানটি ভালভাবে কাজ করেছে:

//replace + sign

encryted_string = encryted_string.Replace("+", "%2b");

//`%2b` is HTTP encoded string for **+** sign

বা

//encode special charactes 

encryted_string = HttpUtility.UrlEncode(encryted_string);

//then pass it to the decryption process
...

0
    string stringToDecrypt = CypherText.Replace(" ", "+");
    int len = stringToDecrypt.Length;
    byte[] inputByteArray = Convert.FromBase64String(stringToDecrypt); 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.