在C中输入密码

时间:2010-04-14 00:53:39

标签: c unix passwords

我知道在键入标准ANSI C时不可能回显*但是有人在控制台中键入密码时没有显示任何内容。我的意思是像Unix / Linux终端中的sudo提示。就像输入命令一样:sudo cp /etc/somefile ~/somedir。通常会提示您输入root密码。当您输入时,终端不显示任何内容。这种效果在C中是否可行?如果是,怎么样?

5 个答案:

答案 0 :(得分:9)

您正在寻找的功能是:getpass()。但是,您会注意到它被标记为“LEGACY”。虽然它不会去任何地方,但该函数不允许指定输入缓冲区的大小,这使得它不是一个非常好的接口。正如Jefromi所指出的那样,glibc手册以允许任意输入大小(并且不是LEGACY)的方式提供portable example code for implementing getpass from scratch

答案 1 :(得分:2)

sudo是用C编写的,所以是的:)。 getpass()函数Safyan mentioned可能就是你想要的,但是如果你感兴趣的话,这里是真正的sudo工具的地方:

http://sudo.ws/repos/sudo/file/dc3bf870f91b/src/tgetpass.c#l70

答案 2 :(得分:1)

穷人这样做的方法是逐个字符地读取用户输入,并在收到每个字符后打印退格字符,后跟*。输出在技术上被发送到控制台,但它会立即被星号擦除并覆盖(通常在该帧甚至被绘制到屏幕之前)。请注意,这不是一个真正安全的方法,并且有几个安全漏洞,但对于低技术低安全性应用程序,它可以工作。

答案 3 :(得分:0)

*这不是ANSI C(感谢Billy)样本

您可以使用_kbhit()检测按键,然后使用_getch()获取值。 这两个功能都不会回显屏幕上的内容。

#include <conio.h>          //For keyboard events
#include <stdio.h>          //Include this or iostream
#include <locale>           
int main()
{
    bool bContinue = true;
    char szBuffer[255] = {0};
    unsigned int nbufIndex = 0;
    while (bContinue)
    {
        if (_kbhit())
        {
            szBuffer[nbufIndex] = _getch();
            if (szBuffer[nbufIndex] == 0xD)
            {
                bContinue = false;
            }
            else
            {
                ++nbufIndex;
                printf("*");
            }
        }
    }
    printf("\n%s\n", szBuffer);
    return 0;
}

答案 4 :(得分:0)

#include <stdio.h>
#include <conio.h>

void main()
{

    char pwd[15];
    int i;
    printf("Enter Password : ");
    for(i=0;i<15;i++)
    {
    pwd[i]=getch();
        if(pwd[i]!='\r')
        {
            printf("*");
        }
        if(pwd[i]==13)
            break;
    }

    printf("\n     \nPassword is : ");
    for(i=0;i<15;i++)
    {
        printf("%d ",pwd[i]);
    }
}