如何在terminal上以星号(*)的forms显示input密码

我想写一个简单的C程序来validationpassword ,例如,如果密码等于1234,那么我想打印欢迎其他再次尝试 。 但问题如下:

我想以 *的forms显示input密码例如 ..如果用户将input1234它将显示为****以避免其他人看到input的密码。

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

不幸的是,这个解决方案是针对平台的。

在Linux或BSD上,你可以使用readpassphrase函数(也有getpass ,尽管它不允许调用者提供缓冲区和缓冲区的大小) 。GNU Lib C的文档(链接被破坏了吗? )库也提供了一个很好的指导,就如何在低级别的termios原语中自己实现这一点,您可以在其他UNIX实现上使用它来代替getpass)。

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

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

  #include<iostream.h> #include<stdio.h> #include<string.h> void main() { char str[10]; int i=0,x,y; cout<<"enter : "; while(1) { str[i]=getch(); if(str[i]==13) break; if(str[0]==127||str[0]==8) continue; if(str[i]==127||str[i]==8) { i--; x=wherex(); y=wherey(); gotoxy(x-1,y); clreol(); } else { cout<<"*"; i++; } } if(strcmp(str,"1234")==0) cout<<"Welcome"; else cout<<"Try again"; }