c++密码存储.txt文件+屏蔽输入

c++ password storage .txt file + masking input

本文关键字:屏蔽 输入 文件 txt 密码 存储 c++      更新时间:2023-10-16

我对编程还很陌生,只是从C++开始。所以我想做一个应用程序——只是为了好玩——用星号屏蔽用户输入。我做了一些研究,找到了我想要的东西。正如您在下面的代码中所看到的,它运行良好,但只检查我放入的字符"correct_password"中的密码。我认为扩展选项会更具挑战性。该程序将写出两个选项:1。register-只需输入您的登录名和密码(不带星号),然后将其存储到一个文件中(我想是fstream),2。login-在输入登录名和密码(星号和getpass中的一样)之后,如果用户确实注册了,它会检查文件中的数据。甚至考虑过加密该文件中的数据,尽管我不知道如何继续。好吧,这只是为了学习一些新东西而编造的事情,我知道这不是一件真正的事情,写这样的代码也没有真正的目的——只是摆弄C++。也许你有办法拍下来?在我写了这个星号的东西之后,我真的不知道我应该把其他选项放在哪里,存储在文件中等等。我很想了解一些想法,并感谢更有经验的程序员的输入:)

我尝试在getpass中使用fstream,但没有成功。一般来说,我想用登录和密码输入来扩展这个程序,将它们存储到.txt文件中,然后程序会检查用户是否注册,在用这个数据输入登录时,会用星号屏蔽——就像我最初想到的那个只屏蔽密码输入的程序一样。我真的不知道如何用getpass内部的那个来分割未屏蔽的输入。

#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
string getpass(const char *dat, bool s_asterisk=true)
{
const char BACKSPACE=8;
const char RETURN=13;
string password;
unsigned char ch=0;
cout << dat;
DWORD con_mode;
DWORD dwRead;
HANDLE hIn=GetStdHandle(STD_INPUT_HANDLE);
GetConsoleMode( hIn, &con_mode );
SetConsoleMode( hIn, con_mode & ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT) );
while(ReadConsoleA( hIn, &ch, 1, &dwRead, NULL) && ch !=RETURN)
{
if(ch==BACKSPACE)
{
if(password.length()!=0)
{
if(s_asterisk)
cout <<"b b";
password.resize(password.length()-1);
}
}
else
{
password+=ch;
if(s_asterisk)
cout <<'*';
}
}
cout << endl;
return password;
}

int main()
{
const char *correct_password="fdsidfjsijdsf21128321873";
START:
string password=getpass("Enter the password: ",true);
if(password==correct_password){
cout <<"nCorrect password."<<endl;
exit(1);
}else{
cout <<"nIncorrect password. Try again.n"<<endl;
goto START;
}
return 0;
}

通常您不希望将实际密码存储在文件中。尽管加密它们会有助于安全性(至少在某种程度上),但通常情况下,它仍然非常不安全,最好避免。

你通常想做的是对密码加盐,然后用加密哈希对加盐的密码进行哈希。然后存储salt和hash,而不是密码本身。

然后(对于最简单的情况),当用户想要登录时,您重复相同的过程:检索他们密码的salt,将salt应用于他们输入的密码,对结果进行散列,最后将结果与您存储的值进行比较。如果它们匹配,则假定用户输入了正确的密码。如果他们不匹配,你知道他们不匹配。

请注意,这只适用于用户在本地(或至少通过安全连接)登录到您的应用程序。如果他们可能通过不安全的连接登录,那么你还需要变得更加复杂。

不过,另一个要点是:几乎所有这些都应该发生在getpass之外。getpass应该做一件事:读取用户的密码。腌制、哈希、存储等等,都应该与之分开进行。