好吧,我被要求用SHA-256做一点工作。我必须从用户那里收到用户名和密码(在控制台中),将密码更改为SHA-256哈希值,然后关闭文件(二进制文件)。然后,我必须再次读取它,获取它的数据并将其与新的用户输入进行比较,检查它们是否相同。使用SHA-256哈希的简单登录系统。问题是,我写了一个随机的用户名和密码,但是当我稍后在第二步中尝试比较它们时,它失败了。 SHA-256部分直接出自原始代码,这并不是分配的重点。
我尝试将所有char数组更改为字符串,使用过的strcpy,strcpy_s和strncpy(以防万一)等,但是似乎不起作用。大多数代码直接来自SHA-256(我的老师发送了),但是我还是把它放在这里
我将整个代码放在pastebin中(有点长):https://pastebin.com/W9jxsbK6
我不知道如何在此文本框中正确进行编辑,因此请使用粘贴容器链接。
struct Credentials {
char user[10];
char password[256];};
int main() {
Credentials c;
char user2[10];
char password2[256];
string test;
fstream file;
int opc;
do{
cout << "Menu:" << endl;
cout << "1.Create new user and password" << endl;
cout << "2.Validate user and password" << endl;
cin >> opc;
switch(opc){
case 1:
cout << "Type the user name" << endl;
cin >> user2;
strcpy_s(c.user, sizeof user2, user2);
cout << "Type the password" << endl;
cin >> password2;
test = SHA256::digestString(password2).toHex();
strcpy_s(c.password, sizeof test, test.c_str());
file.open("credentials.dat",ios::out|ios::binary);
if(!archivo){
cout<<"Error...\n";
return -1;
}
file.write((char*)&c,sizeof(c));
file.close();
break;
case 2:
cout << "Type user name" << endl;
cin >> user2;
cout << "Type password" << endl;
cin >> password2;
file.open("credentials.dat",ios::in|ios::binary);
if(!file){
cout<<"Error...\n";
return -1;
}
if(file.read((char*)&c,sizeof(Credentials))){
if(c.user == user2 && SHA256::digestString(password2).toHex() == c.password){
cout << endl << endl << "User validated" << endl;
}else{
cout << endl << endl << "Error" << endl;
}
}
}
} while (opc > 0 && opc < 3);
cin.ignore();
return 0;
}
答案 0 :(得分:0)
if (c.user == user2)
由于user2
是一个字符数组,并且Credentials::user
也是一个字符数组,因此该行不是您比较两个字符数组的方式。该行要做的是比较两个指针,而不是数组的内容。
要使用的功能是strcmp,或者如果要专门比较N
个字符,则功能是strncmp
。
#include <cstring>
//...
if ( strcmp(c.user, user2) == 0)
{
// strings are equal
}
现在,如果c.user
和/或user2
为std::string
,那么使用==
进行比较就可以了。这就是为什么在这方面使用std::string
比使用char数组直观得多的原因-==
之类的操作实际上可以按预期工作。