客官请听题,请写一段代码从控制台上读取用户输入密码。不过有几点在实现的时候需要特别注意:

1. 最基本的是用户输入的不应该直接明文显示出来,需要用特殊字符显示。

2. 不要用明文储存用户输入的密码。

3. 要考虑到一些特殊按键的输入。

自己写写试试看?

下面是我的实现:

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

关于SecureString

看代码大概都能理解了,我想说的其实是关于SecureString这个类。之前没有接触过这个类,只知道存敏感信息的时候应该用这个类而不是直接用String去储存。

我们为什么要用SecureString去存敏感信息,为什么不直接用String?

  • SecureString中的数据会固定在内存中,不会随着GC的发生而挪动位置,这样就防止了敏感信息在内存有多处的拷贝。而对于String来说它是不会固定在内存中的,也就是说很可能它会被GC多次移动从而在内存中存在多分拷贝。
  • 相比较String,SecureString不是以明文的形式储存在内存中的而是使用了DPAPI[1]进行加密。即使你的内存被交换到了页交换文件中也不会以明文的形式存在。SecueString使用用户的一些信息进行加密(登录的session,进程等信息)[2],这也就意味着如果你的程序出问题了你可以放心的将dump发给你的服务商而不必担心他们会看到你的储存在字符串中的敏感信息。
  • String是不可变的,这也就意味着当你修改信息的时候同时会有新旧两个版本的信息存在于内存中。而SecureString没有这个问题。
  • 另外由于String是不可变的,那么当不需要使用的时候清理起来也比较麻烦。SecureString可以在不使用的情况下将内存置为0来保护数据。

使用SecureString就绝对安全么?

当然不是,世上没有绝对安全这种事情,SecureString只是通过上面这几点增加了获取敏感信息的难度。如果说有人能够访问你的进程内存,他就有办法获得SecureString的内存,既然都到了这一步了应该就有办法有能力去破解了我觉得(我是不会的)。他也可以等待程序啥时候将敏感信息解析为明文的时候获取。

总结:

  • 在涉及到一些敏感信息的时候应该尽可能的使用SecureString来储存数据,当然敏感信息的储存方式就是另一个话题了。
  • 我觉得微软可以考虑给Console提供一个读取加密信息的接口,类似于 public static SecureString ReadSecureString。
  • 关于SecureString还有很多其他的内容,以后慢慢研究。

阅读资料:

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

转载于:https://www.cnblogs.com/imjustice/p/Read_Password_in_Console.html

在控制台读取用户输入密码,你会么?相关推荐

  1. 从控制台读取password - C#

    Tip :    从控制台读取password 语言: C# ______________________________________________________________ 在登陆Lin ...

  2. java读取控制台输入_如何使用Java中的Scaner类从控制台读取输入?

    侃侃尔雅 从控制台读取数据BufferedReader是同步的,因此可以安全地从多个线程对BufferedReader进行读取操作.可以指定缓冲区大小,也可以指定默认大小(8192)可以使用.对于大多 ...

  3. scanner 获取控制台信息_关于java.util.scanner:如何使用Java中的Scanner类从控制台读取输入?...

    如何使用Scanner类从控制台读取输入? 像这样: System.out.println("Enter your username:"); Scanner = input(); ...

  4. python使用正则表达式验证用户输入密码的有效性

    python使用正则表达式验证用户输入密码的有效性 条件: 1,最少有8位 2,字母范围a到z 3,至少有一个字母时大写的 4,至少有一个数字 5,至少有一个特殊字符(_.@.$) #密码验证的条件 ...

  5. python使用正则表达式判别用户输入密码的强弱并提示

    python使用正则表达式判别用户输入密码的强弱并提示 对于用户输入的密码.系统要去分析和判别,密码是否合法是否太简单以至于非常容易被试出来,来提高系统的稳健程度: 密码要强大需要满足: 1,最好9个 ...

  6. 通过cookie保存并读取用户登录信息

    浏览器将cookie以key/value的形式保存到客户机的某个指定目录 通过cookie的getCookies()方法可获取所有cookie对象的集合 通过cookie对象的getName()方法可 ...

  7. c语言用户输入编程,C语言入门教程-Printf:读取用户输入

    Printf:读取用户输入 前面的程序很好,但要是如果能从用户那里读入值5和7而不是使用固定的值的话,那就更好了.可以改为下面的程序: #include int main() {int a, b, c ...

  8. linux获取read值,read命令读取用户输入

    read命令用于从终端或文件中读取用户输入,它读取整行输入,如果没有指定名称,读取的行被赋值给内部变量REPLY. read命令常用选项:-a,-p,-s,-t,-n 1.REPLY变量 $read ...

  9. xcode 不能读取键盘输入的汉字_C++:cin从控制台读取数据时的结束符

    cin 可以用来从键盘输入数据:将标准输入重定向为文件后,cin 也可以用来从文件中读入数据.在输入数据的多少不确定,且没有结束标志的情况下,该如何判断输入数据已经读完了呢? 从文件中读取数据很好办, ...

最新文章

  1. java 柱状图下载_(JFreeChart)Java图表制作
  2. python自己的模块_Python--构建发布自己的模块
  3. c语言进程间通信架构,构建微服务之:微服务架构中的进程间通信
  4. 互斥量(mutex)
  5. spark DAGScheduler、TaskSchedule、Executor执行task源码分析
  6. Emacs(洛谷P6866题题解,C++语言描述)
  7. share一段采集程序的代码
  8. request payload怎么发_如果不是你,我也不会发朋友圈
  9. electron 多语言_Electron实用技巧electronbuilder中用户协议(license)的使用及多语言支持...
  10. 关于git clone http://xxxxxxxxxxx报错的问题
  11. 实现类似shared_ptr的引用计数
  12. 【c语言】两个栈实现一个队列
  13. win10小技巧(初)
  14. 什么是代理IP?怎么在浏览器中配置代理IP?
  15. 这些职场道理不懂,你注定一辈子穷打工
  16. python樱花开放教程_Python画樱花树 !
  17. ROS进阶学习的过程
  18. 齐聚绿城 | 锦江都城酒店聚焦中高端酒店投资新方向
  19. 『科学计算_理论』线性代数几何原理剖析
  20. Eclipse 断点不生效原因之一 Tigger Point 断点右下角出现类似箭头

热门文章

  1. [设计模式] 8 组合模式 Composite
  2. fft快速傅利叶变的C实现
  3. 【目录】 Git 教程
  4. flask前端显示MySQL数据_flask怎样查询mysql并显示在页面上
  5. 基于 RocketMQ 构建阿里云事件驱动引擎EventBridge
  6. 秘密开发一年多,解密奥运史上首个数字云徽章
  7. 实时数仓入门训练营:Hologres性能调优实践
  8. 从业务在线到互联互通,钉钉宜搭进入低代码3.0阶段新模式
  9. Flink SQL 在字节跳动的优化与实践
  10. 2020年8月编程语言排行榜新鲜出炉 - 编程语言世界的假期