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

Fai*_*wal 11 c c++ unix

我想编写一个简单的C程序来验证password,例如,如果密码等于1234,那么我想打印欢迎,否则再试一次.但问题如下:

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

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

Mic*_*yan 17

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

在Linux或BSD,您可以使用readpassphrase功能(也有将getpass,虽然它从不允许到被调用者提供的缓冲区,缓冲区的大小受到影响.对于文档GNU库Ç(链接坏了吗?试试这种替代,而不是)库还提供了一个很好的指导,说明如何根据较低级别的termios原语实现这一点,您可以在其他UNIX实现上使用它来代替getpass).

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

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

  • 对不起,你刚才建议OP从他的控制台应用程序输出一个到身份验证页面的URL ??? (11认同)
  • @MichaelAaronSafyan 暗示替代解决方案是一个有效的观点,但这不是您正在做的事情。相反,您将基于浏览器的第三方身份验证“普遍”优于经典密码身份验证,但事实并非如此。它只是一个独特的范式,具有独特的优点、缺点和适用范围。恕我直言,如果没有更多的上下文说明“X是一种非常形式的身份验证”和“更好的方法是Y”,只会破坏你的信用。替代方法有无数,我们可以引用“pam”、“ssh-keygen”、“kerberos”……来帮助 OP 入门。 (3认同)
  • @MichaelAaronSafyan 安全性或用户体验考虑因素远远超出了这个问题的范围,如果没有更多上下文,您无法以明智的方式解决它们。我建议您删除答案的最后一段,在这种情况下毫无意义。 (2认同)