2010-01-05 1 views
1

Я пытаюсь зашифровать тело электронной почты, которое будет храниться в базе данных, и чтобы избежать несанкционированного доступа к нему, чтобы избежать атаки SQL-инъекции.Исключение Symmetric Algorithm

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 был необработанным кодом пользователя Message = "Значение недействительно." Источник = "mscorlib"

StackTrace: на System.Security.Cryptography.RijndaelManagedTransform.TransformBlock (байт [] INPUTBUFFER, Int32, Int32 inputOffset inputCount, Byte [] OUTPUTBUFFER, Int32 outputOffset) в Demo.BLL.Contact .History.SendEmail (String HTMLBody, Int32 Record_Id) в C: \ Documents and Settings \ Администратор \ Мои документы \ Visual Studio 2008 \ Projects \ BLL \ BLL \ Contact \ History.cs: строка 35 в _Default.BtnSend_Click (отправитель объекта , EventArgs e) в c: \ Documents and Settings \ Администратор \ Мои документы \ Visual Studio 2008 \ Projects \ Demos \ ContactDemo \ Contact.aspx.cs: строка 46 в System.Web.UI.WebControls.Button.OnClick (EventArgs e) в System.Web.UI.WebControls.Button.RaisePostBackEven т (строка eventArgument) на System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent (String eventArgument) в System.Web.UI.Page.RaisePostBackEvent (IPostBackEventHandler SourceControl, String eventArgument) на System.Web.UI.Page.RaisePostBackEvent (NameValueCollection PostData) в System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) InnerException:

ответ

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) шифрованной это хорошо, но где вы храните ключ? Это только защита, если ключ где-то безопаснее данных. Да, он добавляет уровень защиты от SQL Injection, но вы должны исключать возможности SQL Injection с помощью параметризованных операторов.

2) Это может быть неудачно, потому что SymmetricAlgorithm является абстрактным базовым классом, и вам нужно создать экземпляр конкретного класса, например RijndaelManaged.Create();

Кроме того, вы должны использовать TransformFinalBlock() вместо TransformBlock() и Encoding.UTF8.GetBytes() вместо UtilityMA.StringUtil.ConvertUTF16StringToByteArray().

Вот статья о том, как encypt/дешифрования: http://www.sharpdeveloper.net/content/archive/2007/06/27/encryption-for-dummies-in-net.aspx