【问题标题】:Symmetric Algorithm exception对称算法异常
【发布时间】:2010-01-05 22:15:10
【问题描述】:

我正在尝试加密要存储在数据库中的电子邮件正文,以避免未经授权的人阅读它,以避免 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 未被用户代码处理 Message="值无效。" 来源="mscorlib"

堆栈跟踪: 在 System.Security.Cryptography.RijndaelManagedTransform.TransformBlock(字节 [] inputBuffer,Int32 inputOffset,Int32 inputCount,Byte [] outputBuffer,Int32 outputOffset) 在 C:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Projects\BLL\BLL\Contact\History.cs: 35 中的 Demo.BLL.Contact.History.SendEmail(String HTMLBody, Int32 Record_Id) 在 c:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Projects\Demos\ContactDemo\Contact.aspx.cs:line 46 中的 _Default.BtnSend_Click(Object sender, EventArgs e) 在 System.Web.UI.WebControls.Button.OnClick(EventArgs e) 在 System.Web.UI.WebControls.Button.RaisePostBackEvent(字符串 eventArgument) 在 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(字符串 eventArgument) 在 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl,字符串 eventArgument) 在 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) 在 System.Web.UI.Page.ProcessRequestMain(布尔 includeStagesBeforeAsyncPoint,布尔 includeStagesAfterAsyncPoint) 内部异常:

【问题讨论】:

    标签: .net


    【解决方案1】:

    1) 加密没问题,但是您将把密钥存储在哪里?只有当密钥比数据更安全时,它才是保护。是的,它确实为 SQL 注入增加了一层保护,但您应该通过使用参数化语句来消除 SQL 注入的可能性。

    2) 它可能会失败,因为 SymmetricAlgorithm 是一个抽象基类,您需要实例化一个具体的类,例如 RijndaelManaged.Create();

    此外,您可能应该使用 TransformFinalBlock() 代替 TransformBlock(),并使用 Encoding.UTF8.GetBytes() 代替 UtilityMA.StringUtil.ConvertUTF16StringToByteArray()。

    这是一篇关于如何加密/解密的文章: http://www.sharpdeveloper.net/content/archive/2007/06/27/encryption-for-dummies-in-net.aspx

    【讨论】:

      【解决方案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;
      
      byte[] cipherText;
      
      using(ICryptoTransform crypto = symAlgo.CreateEncryptor())
      {
        byte[] block = UtilityMA.StringUtil.ConvertUTF16StringToByteArray(HTMLBody);
        cipherText = crypto.TransformFinalBlock(block, 0, block.Length)
      }
      
      symAlgo.Clear();
      

      【讨论】:

        猜你喜欢
        • 2017-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-10
        相关资源
        最近更新 更多