2017-07-14 156 views
0

我想加密和解密我的连接字符串。以下是用于加密的代码。当我的代码经历了SSA Fortify,我得到如下错误。将StringBuilder转换为安全字符串

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

请让我知道,如果我们可以转换到StringBuilderSecureString什么都可以解决。

+12

具有一个字节数组的数据,然后在后面的字符串生成器,是*已经*有内存中的数据和暴露。如果您的程序实际上需要对检查机器内存的人员进行安全保护(我并不确定这将首先出现在这里),那么在这一点上已经太迟了。 – Servy

+0

你正在寻找一种方法来使字符串安全吗?我不认为字符串建造者在一天结束时与它有很大关系。 如果你想要一个安全的字符串,可能是因为你传递了它,但一个字符串生成器只用于构建字符串,而不是你会传递的权利? –

+1

相关:https://stackoverflow.com/a/25190648/2440262 –

回答

2

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

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

2

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

  • 第一次:sb.Append(Convert.ToInt32(ba[i]).ToString());
  • 二时间:sb.ToString();
  • 第三次:Convert.ToInt32(c.ToString());

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


由于盐does not need to be secret,因此不会在其长度或者,代码只应:

public static int GetSaltSize(byte[] pBytes) 
{ 
    var key = new Rfc2898DeriveBytes(pBytes, pBytes, 1000); 
    byte[] ba = key.GetBytes(2); 
    return ba.SelectMany(x => ((int)x).ToString().ToCharArray()).Sum(); 
} 
+0

你可能只是让它返回16(假设方法名称是准确的,结果是所需的大小,仍然需要计算salt,以字节为单位)。尽管实际上,我可能会仔细研究代码库的其余部分,并发现“GetSaltSize”将完全消除,因为它是自己的加密方案的一部分。 –

+0

@JeroenMostert我刚刚宣布了一个值为16的静态字段,但是谁知道......我只是想至少清理那个混乱 –

+0

我很确定这个名字不准确,因为它将两个数字相加它返回的字节数(实际上与这个答案中的方法略有不同,因为原始数字是按位数字来操作的,而这只是增加了两个字节)。 – Chris