请光临我,因为我现在只使用c ++工作了几天。
我正在开发一个充当日记的控制台应用程序。在这个阶段,我正在开发登录身份验证,并打了一个墙!由于我将处理我的登录和日记存储的文本文件,我想从窥探中加密这些文本文件。
现在,问题是我不知道怎么去解密>>检查用户&&传递>>再次加密。
它会沿着这些方向吗?:
程序载入
解密passwords.txt
如果程序在任何时候关闭,则运行encryptFile()。
验证用户条目
加密passwords.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;
}
}
非常感谢你的时间。
对于我的生活我不知道该怎么做:
用户名:[cin&gt;&gt;用户名]在同一个控制台行,抱歉加倍,但不认为这是一个足够大的问题,对于自己的帖子!感谢。
编辑:
我已成功解密用户名并在创建并存储在文本文件中时传递。然后当用户回来时,他们输入的内容被加密并与文件进行比较。
问题是这只适用于简短的单词,用户传递有效,但用户名和密码不...任何想法为什么?这是我的加密代码:
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;
}
答案 0 :(得分:1)
正确的做法是不加密密码文件 - 问题是文件的加密密钥需要存储在程序可以访问的某个地方,这样可以相对容易地查找和滥用。 / p>
相反,您应该使用密码散列(使用强大的哈希算法,如SHA1)。哈希算法是一种确定性地将一段文本映射到大量文本(称为其哈希)的算法,并且被设计为不费力地不可逆转。基本概念是您获取密码,使用它来计算其哈希值,然后存储该哈希值。稍后,当用户输入密码进行登录时,您再次计算其哈希值并将生成的哈希值与存储的哈希值进行比较。即使有人获得对哈希的访问权限,他们也不会获得密码,这很重要,因为人们经常在应用程序之间共享密码。不要实现自己的SHA1哈希 - 有关库列表,请参阅“What is the best encryption library in C/C++?”。
您还必须使用salting和key stretching来抵御常见的暴力攻击。