2

ユーザー名とパスワードを使用してログインするようにユーザーに求めるプログラムを実行しています。ユーザー名とパスワードのリストを含むテキストファイル (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!

しかし、これは私が望んでいた結果ではありません。私が望んでいたのは、ユーザー名とパスワードのファイルを1行ずつ読み取り、ユーザーの入力と一致する場合、「ログイン成功」を出力するだけで、そうでない場合も同じです一致すると、「無効なユーザー名とパスワード」が表示されます。

例えば

ユーザー名: mary とパスワード: efgh を入力すると、予想される出力が得られます

Login Successfully!

無効なユーザー名とパスワードを入力すると、予想される出力が表示されます

Invalid Username and password.

期待される出力をどのように達成すればよいかについてのアイデアや提案はありますか? ありがとう

4

1 に答える 1

4

break正しい行を見つけた後に a を追加し、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;
}

編集:ところで。パスワード資格情報をプレーン テキスト ファイルで保護することは、あまり良い考えではありません。パスワードのハッシュ値 (salted) を保護し、ユーザー入力もハッシュして、ハッシュを比較する必要があります。この方法では、誰かがファイルを取得したとしても、実際のパスワードを見つけるためにハッシュ アルゴリズムを破る必要があります。

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!

ソルトは、パスワードに追加または統合された小さなデータであり、パスワードがファイルに保存されている間にランダムに生成されます。この方法では、2 人のユーザーが同じパスワードを使用している場合でも、ハッシュは異なります。入力パスワードは同じソルトでハッシュする必要があります。これが、ファイルからソルトを読み取る必要がある理由です。

于 2013-10-10T05:52:01.427 に答える