首页 > 解决方案 > 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;
}

标签: c++

解决方案


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

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

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

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

另一个要点:几乎所有这些都应该发生在外部 getpassgetpass应该只做一件事:从用户那里读入密码。加盐、散列、存储等都应该与此分开发生。


推荐阅读