【问题标题】:password masking in c++C++中的密码屏蔽
【发布时间】:2016-02-09 17:41:47
【问题描述】:

我想用c++实现一个登录表单,所以写了一个函数如下:

string setPass(bool show_asterisk = true)
{
    const char BACKSPACE = 8;//ASCII code for BACKSPACE Key
    const char ENTER = 13;//ASCII code for ENTER Key
    string pass = " ";//initialize string
    char c = ' ';//initialize character 

    while ((c = _getch()) != ENTER)
    {
        if (c == BACKSPACE)
        {
            if (pass.length() != 0)
            {
                if (show_asterisk)
                   cout << "\b \b";
                pass.resize(pass.length() - 1); //resize the length of pass 
            }
        }
        else if (c == 0 || c == 224)//when player press esc key
        {
            _getch();
            continue;
        }
        else
        {
            pass.push_back(c);
            cout << '*';
        }
    }
    cout << endl;
    return pass;
}

下面是执行函数的代码:

cout << "==================" << endl;
cout << "      login       " << endl;
cout << "  ID:";
cin >> id;
cout << "  Password:";
cin >> pwd;
pwd = setPass();

我编译了这段代码,但该功能似乎不起作用,因为密码没有被屏蔽。这是一张显示发生了什么的图片:

我试图解决这个问题,但我无法解决。

【问题讨论】:

  • 您最好在密码提示启动时发出终端控制序列来禁用键盘输入的回显。使用您的方法,仍然有一个很小但存在的间隔,其中字符已输入但尚未删除。适当的安全措施是首先根本不显示它。

标签: c++ visual-c++ terminal


【解决方案1】:

我不知道你如何比较密码。但是,您正在使用= " "; 初始化setPass() 函数内的pass 字符串。请注意,该函数始终返回以无用空格字符开头的密码。

Enter password: ****
Output: " asdf"

其次,我在这部分看不到cin 的任何用途:

cin >> pwd;
pwd = setPass();

我修复了我在这里提到的这些东西,编译了代码,它可以按照你的意愿工作。

【讨论】:

    猜你喜欢
    • 2011-02-01
    • 2013-04-19
    • 2010-12-17
    • 2012-07-25
    • 2016-10-12
    • 2015-09-11
    • 2017-10-02
    • 2015-10-02
    • 2019-04-30
    相关资源
    最近更新 更多