2010-01-05 4 views
1

전자 메일 본문을 암호화하여 데이터베이스에 저장하려고하고 있으며 권한이없는 사용자도 SQL 주입 공격을 피하기 위해 읽지 않습니다.대칭 알고리즘 예외

1- 이메일 암호화에 대해 어떻게 생각하십니까?
2 왜 작동하지 않습니까? 어쨌든 텍스트를 암호화하는 법을 배우고 싶습니다.

SymmetricAlgorithm symAlgo = SymmetricAlgorithm.Create(); 
    // I will not use the default keys, although I think they are random enough. 
    symAlgo.GenerateKey(); 
    symAlgo.GenerateIV(); 

    byte[] key = symAlgo.Key; 
    byte[] iv = symAlgo.Key; 


    ICryptoTransform crypto = symAlgo.CreateEncryptor(); 
    byte[] block = UtilityMA.StringUtil.ConvertUTF16StringToByteArray(HTMLBody); 
    byte[] cipherText = new byte[block.Length + 32]; 

    crypto.TransformBlock(block, 0, block.Length, cipherText, 0); 


    symAlgo.Clear(); 
    crypto.Dispose(); 

crypto.TransformBlock 화재 예외
System.ArgumentException는 메시지 = 사용자 코드에 의해 처리되지 않은했다 "값이 잘못되었습니다." 자료 = "mscorlib에"

스택 트레이스 : System.Security.Cryptography.RijndaelManagedTransform.TransformBlock (바이트 [] INPUTBUFFER, inputOffset INT32, INT32 inputCount 바이트 [] outputBuffer, INT32를 outputOffset) 에서 Demo.BLL.Contact에서 C : \ Documents and Settings \ Administrator \ My Documents \ Visual Studio 2008 \ Projects \ BLL \ BLL \ Contact \ History.cs에있는 .History.SendEmail (String HTMLBody, Int32 Record_Id) : _Default.BtnSend_Click에서 35 (Object sender , EventArgs e) : System.Web.UI.WebControls.Button.OnClick (EventArgs)에서 c : \ Documents and Settings \ Administrator \ My Documents \ Visual Studio 2008 \ Projects \ Demos \ ContactDemo \ Contact.aspx.cs : 줄 46 e) at System.Web.UI.WebControls.Button.RaisePostBackEven t (문자열 eventArgument) System.Web.UI.Page.RaisePostBackEvent에서 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent (문자열 eventArgument) (IPostBackEventHandler sourceControl, 문자열 eventArgument) 에서 에서

답변

0

이 대신 사용해보십시오.

SymmetricAlgorithm symAlgo = SymmetricAlgorithm.Create(); 
// I will not use the default keys, although I think they are random enough. 
symAlgo.GenerateKey(); 
symAlgo.GenerateIV(); 

byte[] key = symAlgo.Key; 
byte[] iv = symAlgo.Key; 

byte[] cipherText; 

using(ICryptoTransform crypto = symAlgo.CreateEncryptor()) 
{ 
    byte[] block = UtilityMA.StringUtil.ConvertUTF16StringToByteArray(HTMLBody); 
    cipherText = crypto.TransformFinalBlock(block, 0, block.Length) 
} 

symAlgo.Clear(); 
2

1) 암호화는 괜찮지 만, 당신은 어디에 저장됩니다 System.Web.UI.Page.ProcessRequestMain (부울 includeStagesBeforeAsyncPoint, 부울 includeStagesAfterAsyncPoint) 의 InnerException에서 System.Web.UI.Page.RaisePostBackEvent (NameValueCollection은 postData를) 키? 키가 데이터보다 안전한 경우에만 보호됩니다. 예, SQL 삽입에 대한 보호 계층을 추가하지만 매개 변수화 된 문을 사용하여 SQL 주입 가능성을 제거해야합니다.

2) SymmetricAlgorithm이 추상 기본 클래스이므로 RijndaelManaged.Create()와 같은 구체적인 클래스를 인스턴스화해야하므로 실패 할 수 있습니다.

또한 UtilityMA.StringUtil.ConvertUTF16StringToByteArray() 대신 TransformBlock() 및 Encoding.UTF8.GetBytes() 대신 TransformFinalBlock()을 사용해야합니다.

여기 encypt하는 방법에 대한 기사의/암호 해독 : http://www.sharpdeveloper.net/content/archive/2007/06/27/encryption-for-dummies-in-net.aspx