繁体   English   中英

C ++:从文件/ UserName和密码读取

[英]C++: Reading from file /UserName and Password

我正在做一个程序,提示用户使用其用户名和密码登录。 我有一个包含用户名和密码列表的文本文件(userandpassword.txt)。 因此,发生的情况是,用户输入了用户名和密码,输入的内容将与文本文件中的用户名和密码匹配。 如果匹配,则他们可以登录,如果不匹配,则将打印出“无效的用户名或密码”。 以下是我所拥有的。

文本文件(userandpassword.txt)

john abcd
mary efgh
jane ijkl

我的密码

string line = " ";
ifstream readFile("userandpassword.txt");
string UserName;
string Password;
string _UserName;
string _Password;

cout << "Enter UserName: ";
cin >> UserName;

cout << "Enter Password: ";
cin >> Password;

while (getline(readFile,line)) {

    stringstream iss(line);
    iss >> _UserName >> _Password;

    if (UserName == _UserName && Password == _Password) {
        cout << "Login Successfully!"<< endl;
    }

    else {
        cout << "InValid UserName And Password"<< endl;
    }

}

问题是如果我输入用户名:john和密码:abcd,它将返回我如下所示的输出

Login Successfully!
InValid UserName And Password
InValid UserName And Password 

而如果我输入用户名:mary和密码:efgh,它将返回我,如下所示

InValid UserName And Password
Login Successfully!
InValid UserName And Password

最后是用户名:jane和密码:ijkl

InValid UserName And Password
InValid UserName And Password
Login Successfully!

但这不是我想要的结果,我想要的是它逐行读取文件中的用户名和密码,如果与用户的输入匹配,它将只输出“成功登录”,如果没有,则输出相同的结果match,它将只打印出“无效的用户名和密码”。

例如

如果我输入用户名:mary和密码:efgh,我的预期输出

Login Successfully!

如果我输入任何无效的用户名和密码,我的预期输出

Invalid Username and password.

关于如何实现预期输出的任何想法或建议? 谢谢

找到正确的行后添加一个break ,并在while循环后面输出无效消息:

bool found = false;
while (getline(readFile,line)) {

    stringstream iss(line);
    iss >> _UserName >> _Password;

    if (UserName == _UserName && Password == _Password) {
        cout << "Login Successfully!"<< endl;
        found = true;
        break;
    }
}

if (!found) {
    cout << "InValid UserName And Password"<< endl;
}

编辑:顺便说一句。 保护纯文本文件中的所有密码凭据不是一个好主意。 您应该保护密码的哈希值(加盐),也对用户输入进行哈希处理,并比较哈希值。 这样,即使有人获取了文件,他也必须破坏哈希算法才能找到实际的密码。

Edit2:哈希可以通过可用的经过良好测试的哈希函数之一生成(例如sha-1,sha-3)。 这种选择取决于它必须具有的安全性以及计算这种哈希的代码的可用性。 一般过程为(伪代码):

cin >> username;
for-each-row in file do:
    read username-in, salt, password-hash-in
    if (username-in == username && hash(salt, password) == password-hash-in):
        success!

盐是一小段数据,已附加或以某种方式集成到密码中,并且在将密码存储到文件时随机生成。 这样,即使两个用户使用相同的密码,哈希也将不同。 输入密码必须使用相同的盐进行哈希处理,这就是为什么必须从文件中读取盐的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM