c++ - c++密码存储.txt文件+屏蔽输入
问题描述
我对编程很陌生——刚从 C++ 开始。所以我想制作一个应用程序——只是为了好玩——它会用星号掩盖用户输入。我做了一些研究,并找到了我正在寻找的东西。正如您在下面的代码中看到的那样,它可以正常工作,但只检查我输入的字符中的密码 - “correct_password”。我认为扩展选项更具挑战性。该程序将写出两个选项:1.注册 - 只需输入您的登录名和密码(不带星号),然后将其存储到文件中(我猜是fstream),2.登录 - 输入登录名和密码后(带星号)它在 getpass 中)如果用户实际注册,它将检查文件中的数据。甚至考虑过加密该文件中的数据,尽管我不知道如何进行。嗯,它' s 只是为了学习一些新东西而编造的,我知道这不是真正的东西,编写这样的代码并没有真正的目的——只是在乱搞 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;
}
解决方案
通常您不想将实际密码存储在文件中。尽管加密它们会有助于安全(至少在某种程度上),但它通常仍然非常不安全,最好避免。
您通常想要做的是对密码进行加盐,然后使用加密散列对加盐密码进行散列。然后你存储盐和哈希,而不是密码本身。
然后(对于最简单的情况)当用户想要登录时,您重复相同的过程:检索他们的密码盐,将盐应用于他们输入的密码,对结果进行哈希处理,最后将该结果与您的值进行比较存储。如果它们匹配,则假定用户输入了正确的密码。如果他们不匹配,你知道他们没有。
请注意,这仅适用于在本地(或至少通过安全连接)登录您的应用程序的用户。如果他们可能通过不安全的连接登录,您还需要变得更加复杂。
另一个要点:几乎所有这些都应该发生在外部 getpass
。getpass
应该只做一件事:从用户那里读入密码。加盐、散列、存储等都应该与此分开发生。
推荐阅读
- reactjs - 卸载组件时显示弹出窗口
- file - imagepicker不会将文件复制到flutter中的其他位置
- reactjs - 为什么此 setInterval 中未定义此 useRef 值?
- python - 如何在Data Frame Python中获取除一列之外的所有列?
- android - 为 64 位缺少 64 位库构建 ionic4 应用程序
- sql - 编写 SQL 查询:获取每分钟的平均值
- javascript - 当浏览器窗口小于 div 大小时,如何保持 div 中心?
- android - 有什么方法可以在视图模型中使用变量初始化房间实时数据?
- powershell - Azure DevOps - 多个应用程序的 SemVer
- javascript - 对在嵌套 api 调用中设置状态感到困惑