c – 如何在终端上以星号(*)的形式显示输入密码

前端之家收集整理的这篇文章主要介绍了c – 如何在终端上以星号(*)的形式显示输入密码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想编写一个简单的C程序来验证密码,例如,如果密码等于1234,那么我想打印欢迎,否则再试一次.但问题是如下:

我想以*(star)的形式显示输入密码.
例如,如果用户将输入1234,将显示为****以避免其他人看到输入的密码.

任何人都可以给我一个想法,如何使用c或c来实现它.
平台:UNIX

解决方法

对此的解决方案是平台特定的,不幸的是.

Linux或BSD上,您可以使用readpassphrase功能(还有getpass,尽管不允许调用者提供缓冲区和缓冲区大小),GNU Lib C(链接断开,尝试this alternative)库的文档也是提供了一个很好的指导,说明如何在低级别的termios原语方面实现这一点,您可以在其他UNIX实现中使用getpass.

在Windows上,您可以使用SetConsoleMode来禁用默认回显行为(因此会回显您自己的字符,如星号).然后可以使用SetConsoleMode恢复回显.

然而,我应该补充说,这是一种非常糟糕的身份验证形式,因为它涉及到更多的密码,这是每个用户存在的祸根(也不是特别安全的).更好的方法是在应用程序中启动一个Web服务器,并输出用户应该验证的URL.这种方法的优点在于,当用户导航到此URL时,该URL可以支持委托登录到第三方身份提供商(如Google,Facebook,Twitter等).即使您不支持第三方身份提供商,这种方法带来了其他好处;如果您有其他基于Web的工具,则该方法可减少用户必须进行身份验证的次数(由于命令行工具和基于Web的工具将共享相同的浏览器会话),并允许您仅实现登录流程一次,这种方法还减轻了网络钓鱼的风险(用户可以在浏览器中输入凭据时明显看到主机,与在命令行中输入凭据相比,更容易欺骗提示,如果您只在最后一步重定向到本地主机,远程主机上的大部分逻辑,这种方法还允许更新授权流独立于具有重要安全优势的客户端命令行应用程序进行部署.就是说,这样的基于Web的登录并不总是正确的方法.还值得研究的替代认证机制,如libpam(在libpam下,您将使用功能pam_authenticate认证用户,而不是采取th e密码直接输入).值得投入一些研究来确定特定用例的最佳机制.

猜你在找的C&C++相关文章