在控制台读取用户输入密码,你会么?
客官請聽題,請寫一段代碼從控制臺上讀取用戶輸入密碼。不過有幾點(diǎn)在實(shí)現(xiàn)的時候需要特別注意:
1. 最基本的是用戶輸入的不應(yīng)該直接明文顯示出來,需要用特殊字符顯示。
2. 不要用明文儲存用戶輸入的密碼。
3. 要考慮到一些特殊按鍵的輸入。
自己寫寫試試看?
?
下面是我的實(shí)現(xiàn):
private SecureString ReadPassword(){ConsoleKeyInfo key;SecureString password = new SecureString();key = Console.ReadKey(true);while (key.Key != ConsoleKey.Enter){//如果用戶退格需要將最后一個字符在界面上和字符串里同時刪除if (key.Key == ConsoleKey.Backspace){if (password.Length > 0){password.RemoveAt(password.Length - 1);//利用控制字符\b退格,但是退格是不會刪除最后一個字符的,用空格覆蓋了最后一個字符。 Console.Write("\b \b");}}//忽略特殊控制字符,比如說tab, esc等else if (key.KeyChar >= 32 && key.KeyChar <= 126){password.AppendChar(key.KeyChar);Console.Write("*");}key = Console.ReadKey(true);}Console.WriteLine();password.MakeReadOnly();return password;} View Code?
關(guān)于SecureString
看代碼大概都能理解了,我想說的其實(shí)是關(guān)于SecureString這個類。之前沒有接觸過這個類,只知道存敏感信息的時候應(yīng)該用這個類而不是直接用String去儲存。
我們?yōu)槭裁匆肧ecureString去存敏感信息,為什么不直接用String?
- SecureString中的數(shù)據(jù)會固定在內(nèi)存中,不會隨著GC的發(fā)生而挪動位置,這樣就防止了敏感信息在內(nèi)存有多處的拷貝。而對于String來說它是不會固定在內(nèi)存中的,也就是說很可能它會被GC多次移動從而在內(nèi)存中存在多分拷貝。
- 相比較String,SecureString不是以明文的形式儲存在內(nèi)存中的而是使用了DPAPI[1]進(jìn)行加密。即使你的內(nèi)存被交換到了頁交換文件中也不會以明文的形式存在。SecueString使用用戶的一些信息進(jìn)行加密(登錄的session,進(jìn)程等信息)[2],這也就意味著如果你的程序出問題了你可以放心的將dump發(fā)給你的服務(wù)商而不必?fù)?dān)心他們會看到你的儲存在字符串中的敏感信息。
- String是不可變的,這也就意味著當(dāng)你修改信息的時候同時會有新舊兩個版本的信息存在于內(nèi)存中。而SecureString沒有這個問題。
- 另外由于String是不可變的,那么當(dāng)不需要使用的時候清理起來也比較麻煩。SecureString可以在不使用的情況下將內(nèi)存置為0來保護(hù)數(shù)據(jù)。
使用SecureString就絕對安全么?
當(dāng)然不是,世上沒有絕對安全這種事情,SecureString只是通過上面這幾點(diǎn)增加了獲取敏感信息的難度。如果說有人能夠訪問你的進(jìn)程內(nèi)存,他就有辦法獲得SecureString的內(nèi)存,既然都到了這一步了應(yīng)該就有辦法有能力去破解了我覺得(我是不會的)。他也可以等待程序啥時候?qū)⒚舾行畔⒔馕鰹槊魑牡臅r候獲取。
總結(jié):
- 在涉及到一些敏感信息的時候應(yīng)該盡可能的使用SecureString來儲存數(shù)據(jù),當(dāng)然敏感信息的儲存方式就是另一個話題了。
- 我覺得微軟可以考慮給Console提供一個讀取加密信息的接口,類似于 public static SecureString ReadSecureString。
- 關(guān)于SecureString還有很多其他的內(nèi)容,以后慢慢研究。
?
閱讀資料:
Windows Data Protection, http://msdn.microsoft.com/en-us/library/ms995355.aspx
引用:
[1]:? Making Strings More Secure, http://blogs.msdn.com/b/shawnfa/archive/2004/05/27/143254.aspx#144606
[2]: SecureString Redux, ?http://blogs.msdn.com/b/shawnfa/archive/2006/11/01/securestring-redux.aspx
轉(zhuǎn)載于:https://www.cnblogs.com/imjustice/p/Read_Password_in_Console.html
總結(jié)
以上是生活随笔為你收集整理的在控制台读取用户输入密码,你会么?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tfs2012安装
- 下一篇: 巧用EditPlus包含VS2010网站