将StringBuilder转换为安全字符串

时间:2017-07-14 13:56:12

标签: c#

我正在尝试加密和解密我的连接字符串。以下是用于加密的代码。当我编写代码SSA Fortify时,我收到如下错误。

  

xyz.cs以不安全的方式存储敏感数据,使其成为可能   通过检查堆来提取数据。

public static int GetSaltSize(byte[] pBytes)
{
      var key = new Rfc2898DeriveBytes(pBytes, pBytes, 1000);
      byte[] ba = key.GetBytes(2);
      StringBuilder sb = new StringBuilder();
      for (int i = 0; i < ba.Length; i++)
      {
        sb.Append(Convert.ToInt32(ba[i]).ToString());
      }
      int saltSize = 0;
      string s = sb.ToString();   // <--- insecure?
      foreach (char c in s)
      {
        int intc = Convert.ToInt32(c.ToString());
        saltSize = saltSize + intc;
      }
      return saltSize;
}

如果我们可以将StringBuilder转换为SecureString或者解决方案是什么,请与我们联系。

2 个答案:

答案 0 :(得分:2)

有专门的SecureString类用于在内存中存储敏感数据。我想你的代码是将盐大小作为标题添加到某些序列化表示中。您不应该这样做,而是通过ProtectedData类使用DPAPI,它可以安全地存储您的连接字符串和其他敏感信息。

当涉及使用敏感连接字符串时,我会推测一点,假设我们正在讨论数据库连接字符串(例如SqlConnection)。然后,.Net连接API 不会公开用于初始化凭据的安全方法。用户名/密码必须以纯文本形式呈现给数据库连接类。 如果您正在谈论SQL Server连接,则应使用集成身份验证,该身份验证不需要连接字符串中的任何敏感信息。

答案 1 :(得分:2)

你在内存中没有值的尝试比没有尝试保护它更糟糕,因为你没有将int 一次存储在内存中,而是三次

  • 第一次:{​​{1}}
  • 第二次:abstract=False
  • 第三次:sb.Append(Convert.ToInt32(ba[i]).ToString());

所以你有两次值和完整句子一次。

由于盐does not need to be secret,因此也不是它的长度,您的代码应该只是:

sb.ToString();