2017-07-14 115 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