如何在终端上显示星号(*)形式的输入密码
how to show enter password in the form of Asterisks(*) on terminal
我想写一个简单的C
程序来验证password
,例如,如果密码等于1234,那么我想打印欢迎否则请重试。但问题如下:
我想以
*
(star)的形式显示输入密码。例如。。如果用户输入1234,它将显示为****
,以避免其他人看到输入的密码。
有人能告诉我如何使用c或c++来实现它吗。平台:UNIX
不幸的是,这方面的解决方案是特定于平台的。
在Linux或BSD上,您可以使用readpassphrase函数(还有getpass,尽管它不允许调用方提供缓冲区和缓冲区大小。GNU Lib C(链接已断?请尝试此替代方案)库的文档也提供了一个很好的指南,说明如何在较低级别的termios基元中自己实现这一点,您可以在getpass的其他UNIX实现中使用它)。
在Windows上,您可以使用SetConsoleMode禁用默认的回显行为(从而回显您自己的字符,如星号)。然后,您可以使用SetConsoleMode来恢复回显。
然而,我应该补充一点,这是一种非常糟糕的身份验证形式,因为它涉及更多的密码,这些密码是每个用户存在的祸根(也不是特别安全)。更好的方法是在应用程序中启动一个Web服务器,并输出用户应该进行身份验证的URL。这种方法的优点是,当用户导航到此URL时,该URL可以支持委托登录到第三方身份提供商,如谷歌、脸书、推特等。即使你不支持第三方识别提供商,这种方法也有其他好处;如果你有其他基于web的工具,这种方法可以减少用户必须进行身份验证的次数(因为命令行工具和基于web的软件将共享同一个浏览器会话),并且只允许你实现一次登录流,这种方法还降低了网络钓鱼的风险(与在命令行上输入凭据相比,用户在输入凭据时可以在浏览器中清楚地看到主机,在命令行中伪造提示要容易得多。如果在最后一步只重定向到localhost,但在远程主机上执行大部分逻辑,则这种方法还允许独立于客户端命令行ap部署授权流的更新具有重要安全优势的应用程序。也就是说,像这样基于网络的登录并不总是正确的方法。还值得研究其他身份验证机制,如libpam(在libpam下,您可以使用函数pam_authenticate对用户进行身份验证,而不是直接将密码作为输入)。值得投资一些研究来确定适合您特定用例的最佳机制。
在Linux和其他一些类似Unix的平台上,您可以使用termios.h
来实现这一点。您需要为输出禁用回显结束规范模式,并在每个获得字符后打印*
。有C代码示例:
#include <termios.h>
struct termios term;
/* Disable echo input characters and buffered input by disabling ICANON*/
static void disable_echo() {
struct termios new;
if (tcgetattr(fileno(stdin), &term) != 0) {
perror("tcgetattr failed");
exit(-1);
}
new = term;
new.c_lflag &= ~ICANON;
new.c_lflag &= ~ECHO;
if (tcsetattr(fileno(stdin), TCSAFLUSH, &new) != 0) {
perror("tcsetattr failed");
exit(-1);
}
}
/* Enable normal terminal state after getting password*/
static void enable_echo() {
if (tcsetattr(fileno(stdin), TCSAFLUSH, &term) != 0) {
perror("tcsetattr failed");
exit(-1);
}
}
/* Read password which will be printed as `*` characters */
static void mask_getstr(char* buf, size_t size){
char c = ' ';
while (--size > 0 && (c = getchar()) != 'n') {
*buf++ = c;
putchar('*');
}
*buf = ' ';
}
#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";
}
- Cryptopp:获取密码输入的填充字符串
- 如何在QT中为QInputDialog输入密码时设置背景非活动和灰色?
- 区分键盘记录器中的密码和其他类型的键盘输入
- 程序输入密码并解锁窗口7,8,10
- Vigenere密码的C++功能有时才起作用(适用于某些输入,跳过其他输入的班次)
- 如何修复密码条目,它一次输入两个字符
- C++简单的暴力项目密码输入方法
- 密码屏蔽(输入显示为********)
- c++密码存储.txt文件+屏蔽输入
- 如何在牡丹加密中检查输入的密码是否正确
- 如何让我的checkLength函数循环,直到用户输入超过5个字符的密码
- 当我输入密码时,第一个字母和我输入的不同
- 带有SSL的libWebsocks服务器不输入PEM密码短语
- 如何使Do功能只重复输入密码
- 防止提示输入 PEM 密码
- 为什么GPGME / GnuPG使用pinentry进行密码输入
- 如何在不提示输入密码的情况下设置计划任务
- 嗨,我们在c++中有这个作业,它涉及到用户名和密码的输入
- 如何在终端上显示星号(*)形式的输入密码
- 为游戏中使用的对称密码输入字符