1. ホーム
  2. c#

[解決済み] Base-64 char 配列の長さが無効です。

2022-01-30 22:02:38

質問

タイトルの通り、取得しています。

無効な長さのBase-64 char 配列になります。

この問題については、ここで読んだことがあります。 ViewStateが大きい場合は、SQLに格納することを提案しています。私は ウィザードを使用し、大量のデータを収集するため、可能性としては は、私のViewStateは大きいです。しかし、私は"store-in-DB".に頼る前に、私のViewStateは大きいです。 しかし、私が"store-in-DB"に頼る前に、多分誰かが見て、私が持っているかどうか私に教えてください。 他の選択肢は?

以下の方法で配信用メールを構築しています。

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

Encryptメソッドは次のようになります。

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

hotmailで表示されるHTMLはこんな感じです。

<ブロッククオート

以下のリンクをクリックするか ブラウザに貼り付けて確認します。 メールアカウント

http://localhost:1563/Accounts/VerifyEmail.aspx?a=YOHY57xYRENEOu3H+FGq1Rf09AZAI56EPjfwuK8XWKg=

受信側では、VerifyEmail.aspx.csのページに一行があります。

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

以下はUserNameToVerifyのゲッターです。

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

そして、これがGetQueryStringValueメソッドです。

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

そして、decryptメソッドは次のようになります。

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

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

このエラーはコード修正で改善できるのでしょうか、それともViewStateをデータベースに保存しなければならないのでしょうか?

解決方法は?

base64でエンコードされた文字列の長さは常に4の倍数です。 もし4の倍数でない場合、次のようになります。 = の文字が追加されます。 クエリ文字列の形式は ?name=value には問題があります。 value が含まれています。 = のチャタリング(一部はドロップされます、正確な動作は覚えていません)。 を適切な数だけ追加することで回避できるかもしれません。 = 文字が含まれています。

編集1

の値は、そのような場合は UserNameToVerify がありました。 "+" に変更されました。 " " のようにする必要があるかもしれません。

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

これで長さが揃うはずです。

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

もちろん UrlEncode (LukeHの答えのように)これはすべて無意味になるはずです。