2017-04-13 88 views
2

很長時間潛伏在這裏終於有一個問題,我沒有看到。我正在用dotnet核心編寫一個c#控制檯應用程序,並試圖允許用戶輸入密碼,並擔心安全性,特別是內存轉儲。在c#dotnet核心控制檯應用程序中保護密碼輸入

以下:Password masking console application我的理解是,存儲爲一個字符串變量密碼可以通過內存轉儲reference)被曝光。

SecureString通常是這裏的方式,但似乎不支持dotnet core

我試着修改代碼來使用char數組,因爲我的有限理解是它不是不可變的,所以它不會全部存儲在單個內存中。老實說雖然安全不是我的特長,所以我的問題是,如果下面的代碼正確地保護我通過內存轉儲公開密碼?

 Console.WriteLine("Enter pass"); 
     char[] passwordArray = new char[256]; 
     int whileIndex = 0; 

     while (true) 
     { 
      ConsoleKeyInfo key = Console.ReadKey(true); 
      if (key.Key == ConsoleKey.Enter) 
      { 
       break; 
      } 
      else if (key.Key == ConsoleKey.Backspace) 
      { 
       if (whileIndex != 0) //so it doesn't explode if someone holds backspace 
       { 
        whileIndex--; 
       } 
      } 
      else 
      { 
       passwordArray[whileIndex] = key.KeyChar; 
       whileIndex++; 
      } 
     } 
     //Truncate array to length of password 
     var endIndex = Array.IndexOf(passwordArray,'\0'); 
     char[] shortenedPasswordArray = new char[endIndex]; 
     Array.Copy(passwordArray, shortenedPasswordArray, endIndex); 

     //Authentication code here 

     //Wipe the characters when done 
     foreach(var passChar in passwordArray) 
     { 
      passwordArray[passChar] = '\0'; 
     } 

     foreach (var passChar in shortenedPasswordArray) 
     { 
      shortenedPasswordArray[passChar] = '\0'; 
     } 
+0

AFAIK數組仍然會被分配連續的內存空間, –

+0

您的威脅模型是什麼?誰在做什麼? –

+0

@NeilMcGuigan不確定這個背景有多大幫助。此應用程序的目的是運行LDAP查詢來下拉AD對象的列表,並且我正在請求用戶/傳遞來綁定連接。雖然我個人認爲它比保存證書/在設備之間傳遞它們更低的風險,但它可能會由具有有價值證書的IT管理員執行,因此我想在此進行盡職調查。 – Polymergraphy

回答

2

一些評論: 1)首先記住,安全是不是在一個應用程序解決。對於完全訪問機器的人來說,幾乎沒有任何事情可以使密碼真正安全。

(有趣的練習:你如何不用在內存中保存的密碼都驗證了密碼?)

2)僅SecureString的,讓你決定什麼時候它給你更多的控制權密碼的壽命在內存消失了。普通字符串可能會在內存中持續很長時間,甚至直到程序退出,因爲它在垃圾回收之前不會消失。 SecureString可以讓你明確地清除它,但是直到那時它仍然存在於內存中。 3)使用你自己的字符數組是一個好主意,但我可能使用了一個List,因爲它允許一個可變長度,或者甚至是一個LinkedList,因爲它將字符擴展到內存中。聳肩。請參閱#1並考慮您保護密碼的攻擊類型。

+2

第一段是緊鉗。任何需要攻擊者無限制物理訪問運行該程序的機器的漏洞都不是您作爲程序員應該擔心的漏洞。這不是代碼或數據安全問題;這是一個物理安全問題。所謂的「白盒安全」,即攻擊者可以看到計算機所做的一切並且仍然無法破解安全的想法,這被認爲是困難的,一些人認爲這是不可能的。 – KeithS

+0

欣賞這個答案和評論。我意識到我擔心的情況可能涉及到一臺如此危險的電腦,以至於無法挽救它。安全只是一個巨大的野獸,我是新手,而且大多數都希望能夠理智地檢查我是不是在做一些「密碼post-it卡在顯示器上」,相當於在這裏編碼。謝謝。 – Polymergraphy

+0

我曾經爲微軟工作過。他們有一項政策,只允許安全團隊的人員從事安全工作,因爲在計算機安全方面存在諸多問題,未經培訓的人很可能會造成災難性後門。如果你不瞭解這個領域,不要感到不好,並且提問很好。 –

0

我會存儲用戶的輸入後,它已被安全密碼散列算法處理。當用戶需要再次驗證時可以訪問相同的算法,並使用結果驗證用戶。

+0

Windows已驗證散列算法可用,但不是更安全,因爲您仍然需要內存中的散列碼。 –

+0

是的,你說得對。哈希算法將需要一個參數,它只是指向內存中的一個地方。我並不確定如何保護應用程序的內存,除非字面上整個內存空間都受到某層加密的保護,所有存儲的數據在到達內存之前都進行了加密。 –

+0

也許您可以存儲您比較輸入的密鑰文件。我真的不知道如何防止用戶的輸入到達內存。我看到的唯一的其他選擇是使用某種類型的認證器,它可以連接到移動設備,或者您可以在機器上存儲一些SSH密鑰。但是到那時,任何具有管理權限的惡意程序或用戶都可以訪問您的SSH密鑰。這是一個人事問題,而不是軟件問題。 –