1

我正在开发一个充当日记的控制台应用程序。在这个阶段,我正在开发登录身份验证并且遇到了一些问题!由于我将处理用于登录和日记存储的文本文件,因此我想加密这些文本文件以防被窥探。

现在,问题是我不知道如何进行解密>>检查用户&&pass>>再次加密。

会是这样吗?:

  • 程序负载

  • 解密密码.txt

  • 如果程序在任何时候关闭,则运行 encryptFile()。

  • 验证用户输入

  • 加密密码.txt

如果我走在正确的路线上,我该如何实施呢?我搜索了使用 c++ 的文本文件的加密教程,但它们不是很有帮助。

这是我被屠杀的初学者密码.txt 代码,我该从哪里开始?如果您推荐我错过的加密教程/文章,请发布!

void checkPasswordFile() {

string username;
string password;
string passwordAgain;

string userIn;
string passIn;
string line;

ifstream passwordFile("passwords.txt");
istringstream instream;


if (passwordFile.good()) {


    cout << "\t==================================" << endl;
    cout << "\t----------------------------------" << endl;
    cout << "\tYou are a returning user, please fill in your details" << endl;




    while(!passwordFile.eof()) {
        getline(passwordFile, line);
        instream.clear();
        instream.str(line);
        username = line;

        getline(passwordFile, line);
        instream.clear();
        instream.str(line);
        password = line;
    }


    do {
        cout << "Username: " << endl;
        cin >> userIn;
        cout << "Password: " << endl;
        cin >> passIn;


        if (userIn == username && passIn == password) {

            displayMenu();

        } else {

            cout << "Username and Password Do Not Match, Try Again" << endl;
        }

    } while(userIn != username && passIn != password);


} else {
    cout << "file no exist";


    ofstream passwordFile;
    passwordFile.open ("passwords.txt", ios:: in | ios::app);

    cout << "\t==================================" << endl;
    cout << "\t----------------------------------" << endl;
    cout << "\tThis is your first run, please enter a username and password" << endl;
    cout << "\tUsername: " << endl;
    cin >> username;
    cout << "\tPassword: " << endl;
    cin >> password;

    /*
    Do Loop:
    Prompts Re-Entry if PasswordAgain is not equal to Password
    */
    do {

        cout << "Re-Type Password: ";
        cin >> passwordAgain;

        if(password != passwordAgain) {
            cout << "Passwords Do Not Match! Try Again" << endl;
        }
    } while(password != passwordAgain);


    passwordFile << username << "\n";
    passwordFile << password;
   }

}

非常感谢您的宝贵时间。

ps 对于我的生活,我不知道该怎么做:

用户名:[cin>>username] 在同一控制台行上,很抱歉加倍,但认为这对于自己的帖子来说不是一个足够大的问题!谢谢。

编辑:

我已经成功地解密了用户名并在创建并存储在文本文件中时通过。然后当用户回来时,他们输入的内容被加密并与文件进行比较。

问题是这仅适用于简短的单词,用户密码有效,但用户名和密码不起作用......任何想法为什么?这是我的加密代码:

 char encryptKey = 'h';
        cout << "\tUsername: ";
        cin >> userIn;
        cout << "\tPassword: ";
        cin >> passIn;

        for (int i = 0; i < userIn.size(); i++) {
            userIn[i] ^= encryptKey;
        }
        for (int x = 0; x < passIn.size(); x++) {
            passIn[x] ^= encryptKey;
        }

        if (userIn == username && passIn == password) {

            displayMenu();

        } else {

            cout << "\tUsername and Password Do Not Match, Try Again" << endl;
        }
4

1 回答 1

1

正确的做法是不要加密密码文件——问题是文件的加密密钥需要存储在程序可以访问的地方,这将使其相对容易找到和滥用。

相反,您应该使用密码散列(使用像 SHA1 这样的强散列算法)。哈希算法是一种将一段文本确定性地映射到一个大数(称为其哈希)上的算法,其设计目的是无需付出很大努力即可实现不可逆。基本概念是您获取密码,使用它来计算其哈希值,然后存储该哈希值。稍后,当用户输入密码登录时,您再次计算其哈希值并将生成的哈希值与存储的哈希值进行比较。即使有人获得了对哈希的访问权,他们也不会获得密码,这很重要,因为人们经常在应用程序之间共享密码。不要实现自己的 SHA1 哈希 - 请参阅“什么是 C/C++ 中最好的加密库? ”以获取库列表。

您还必须使用加盐键拉伸来防御常见的暴力攻击。

于 2012-07-13T00:29:36.333 回答