programing

Base-64 문자 배열의 길이가 잘못되었습니다.

showcode 2023. 5. 25. 22:13
반응형

Base-64 문자 배열의 길이가 잘못되었습니다.

제목에서 알 수 있듯이, 다음과 같은 이점을 얻을 수 있습니다.

Base-64 문자 배열의 길이가 잘못되었습니다.

저는 여기서 이 문제에 대해 읽었고, 그 제안은 ViewState가 크면 SQL에 저장하는 것 같습니다.데이터 수집이 많은 마법사를 사용하고 있으므로 ViewState가 클 수 있습니다.하지만 제가 "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);
}

암호화 방법은 다음과 같습니다.

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+FGq1Rf09AZAI56EPjfwuK8XWG=

VerifyEmail.aspx.cs 페이지의 수신측에는 다음과 같은 행이 있습니다.

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

다음은 UserNameToVerify에 대한 getter입니다.

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

GetQueryStringValue 메서드는 다음과 같습니다.

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

이 오류를 코드 수정으로 해결할 수 있습니까? 아니면 ViewState를 데이터베이스에 저장해야 합니까?

base64의 입니다. 경우에는 4의 배수가 .=문자가 추가될 때까지 추가됩니다. 문식 형식의 입니다.?name=value다음과 같은 경우에 문제가 있습니다.value를 포함합니다.=문자(일부 문자는 삭제됩니다. 정확한 동작을 기억하지 못합니다.)올바른 숫자를 추가해도 문제를 해결할 수 있습니다.=디코드를 .base64 디드를수전문자의.

편집 1

은 다과같은가수있다니습발의 할 수 .UserNameToVerify을 가지고 있습니다"+" 로변됨으로 " "따라서 다음과 같은 작업이 필요할 수 있습니다.

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

이것은 길이를 정확하게 맞출 것입니다.

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

론입니다물에 전화합니다.UrlEncode(LukeH의 대답처럼) 이 모든 것을 무마하게 만들어야 합니다.

쿼리 문자열에 Base64 문자열을 포함할 때 URL 인코딩만 하면 됩니다.

문자열의 되어야 하는 즉, Base64 인은딩쿼즉일문의경부하다사니합용일문자를부는,+그리고./그리고 어쩌면=문자열이 올바르게 인코딩되지 않으면 다른 쪽 끝에서 성공적으로 디코딩할 수 없으므로 오류가 발생합니다.

이 메서드를 사용하여 Base64 문자열을 인코딩할 수 있습니다.

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

저는 아직 투표나 논평을 할 만큼 평판이 좋지 않지만, LukeH의 대답은 저에게 딱 맞습니다.

AES 암호화는 현재 사용하는 표준이므로 base64 문자열(적어도 내가 본 모든 암호화/암호 해독 구현)을 생성합니다.이 문자열의 길이는 4의 배수입니다(string.length% 4 = 0).

처음이나 끝에 + 및 = 문자열을 포함하고 있었는데, URL의 쿼리 문자열에 연결하기만 하면(예를 들어 생성한 전자 메일에서) 올바르게 표시되지만 링크가 추적되고 .NET 페이지가 링크를 수신하여 이에 넣습니다.페이지. 요청.QueryString. 이러한 특수 문자는 사라지고 문자열 길이는 4의 배수가 되지 않습니다.

문자열의 앞에는 특수 문자(예: +)가 있고 마지막에는 =가 있으므로 원래 쿼리 문자열에 있었던 것과 일치하지 않는 방식으로 사이퍼 텍스트를 변경할 때 차이를 메우기 위해 =를 추가할 수는 없습니다.

사이퍼 텍스트를 HttpUtility로 묶습니다.URLNcode(HtmlEncode가 아님)는 쿼리 문자열 컬렉션에 해석될 때 .NET이 해당 문자를 다시 원래 상태로 구문 분석하도록 하는 방식으로 비영숫자 문자를 변환합니다.

좋은 점은 URL에 대한 쿼리 문자열을 생성할 때만 URL 코드를 수행하면 된다는 것입니다.들어오는 쪽에서는 자동으로 원래 문자열 값으로 다시 변환됩니다.

여기 몇 가지 코드 예제가 있습니다.

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

데이터를 알지 못한 채 UserNameToVerify가 4의 배수가 아닐 것으로 예상됩니다.msdn에서 FromBase64String을 확인합니다.

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

암호화된 문자열에는 두 개의 특수 문자가 있습니다.+그리고.=.

기호가 오류를 제공하고 있었기 때문에 아래 솔루션이 제대로 작동했습니다.

//replace + sign

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

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

OR

//encode special charactes 

encryted_string = HttpUtility.UrlEncode(encryted_string);

//then pass it to the decryption process
...
    string stringToDecrypt = CypherText.Replace(" ", "+");
    int len = stringToDecrypt.Length;
    byte[] inputByteArray = Convert.FromBase64String(stringToDecrypt); 

암호화 사용 중

Http 유틸리티.UrlEncode(암호화된 텍스트);

암호 해독 중

사용하다

        value = HttpUtility.UrlDecode(value);
        value = value.Replace(" ", "+");//to remove any empty spaces
        value = value.Replace('-', '+').Replace('_', '/');//replace special char
        while (value.Length % 4 != 0) value += '='; //it should be divisible by 4 or append = 

그런 다음 암호 해독을 위해 이 값 전송

언급URL : https://stackoverflow.com/questions/2925729/invalid-length-for-a-base-64-char-array

반응형