C++ 密码输入错误时锁定应用程序(c/c+;+;)

C++ 密码输入错误时锁定应用程序(c/c+;+;),c++,login,C++,Login,如果输入了3次不正确的密码,我想阻止用户(5分钟)访问特定的基于Windows的应用程序(C/C++)。我是否需要在系统级别维护日志文件,或者是否有任何方法维护计时器检查的某些参数(例如在Cookies中) 正如乔纳森在评论中所说,如果代码(应用程序)仅在本地运行,任何方案通常都很容易绕过。如果服务器上至少有一些运行的组件受到了合理的保护,那么您就有了更好的机会 对于“仅本地方案”,最简单的方法是: int count = 0; for(;;) { ask_password();

如果输入了3次不正确的密码,我想阻止用户(5分钟)访问特定的基于Windows的应用程序(C/C++)。我是否需要在系统级别维护日志文件,或者是否有任何方法维护计时器检查的某些参数(例如在Cookies中)

正如乔纳森在评论中所说,如果代码(应用程序)仅在本地运行,任何方案通常都很容易绕过。如果服务器上至少有一些运行的组件受到了合理的保护,那么您就有了更好的机会

对于“仅本地方案”,最简单的方法是:

int count = 0;
for(;;)
{ 
    ask_password();
    if (password == expected_password)
        break;
    count++;
    if (count == 3)
    {
       Sleep(300000);    // 5 minutes = 300000 ms. 
       count = 0;
    }  
}
当然,这只需要用户关闭应用程序并再次启动它以绕过超时。为了避免这种“帮助”,您必须将“计数”存储在某种外部存储器中(注册表项可能是最简单的),以及上次故障发生的时间戳。但是,除非您至少将应用程序拆分为一个以提升权限运行的服务器进程(这也意味着“普通用户”无法安装应用程序,只有具有管理员权限的用户才能安装),否则用户还可以很容易地更改注册表以绕过密码休眠

当然,一个简单但相对有效的防止“在第三个坏密码上睡觉”的方法是,每次错误尝试都睡几秒钟。这将使机器破解密码变得相当困难,因为现在每次尝试破解密码都需要两秒钟,而不是典型密码比较的“几乎瞬间”

很明显,你必须问问自己,与有人试图闯入应用程序的风险相比,做这些事情有多大的价值。你在保护什么?有人闯入有什么价值?完全绕过密码有多困难(例如,密码检查上的二进制补丁)?密码/用户名是如何存储在系统中的(有足够技能的人可以从文件中解码密码吗?)


可能没有牢不可破的应用程序/密码系统。这只是一个问题,你如何努力使它与别人打破它的价值-如果价值很高,你有正确的人致力于打破它,它可以被打破,无论它是多么好的保护。如果没有别的办法,对知道密码的人进行一些勒索、折磨或诸如此类的行为可能会奏效。。。当然,大多数人不会为了找到你的Facebook密码而这么做。但是,如果你在一家国际银行工作,就需要不止一个用户名/密码来保护银行的全部内容不被窃取

Cookie存在于web应用程序中。您似乎正在描述一个本地Win32应用程序。是的,它是本地Win32应用程序。我可以像cookies一样维护一些临时文件吗?或者还有其他好的方法吗?任何例子都会非常有用:有无数种方法可以做到这一点。几乎每一个都很容易被击败(包括注册表、临时文件、内存计时器…),非常好的解释!!这解决了一部分问题。我还想知道一件事,若计数器在注册表中,那个么它只会在指定的时间段内阻止应用程序。。。是否可以将锁定限制限制到特定实例??e、 g.如果我有两个相同应用程序的运行实例。我想限制输入错误密码的实例/文件的使用,但其他实例应该正常工作。如何在注册表中存储特定实例的信息??基于进程ID???可以编写一些脚本??使用注册表的目的是防止进程的新实例绕过锁定-换句话说,如果“User1”尝试登录,失败三次,然后关闭应用程序,“User1”应该无法在5分钟内再次登录,对吗?无论使用哪个应用程序实例。因此,您需要存储上次登录失败的用户和时间,以及登录尝试失败的次数。但是当然,如果你这样做,你仍然会遇到一个问题,如果有人认识很多用户,那么仍然可以尝试很多用户/密码组合。当然,还有一点需要考虑:如果你在注册表中放入“LastLoginAttentinterUserName”,这会变得非常明显。同样,在注册表中使用用户名(只需调用用户“PangalacticGargleBlaster”并搜索注册表以找到它的存储位置)。所以密钥和值需要加密。当然,如果它是一个独立的应用程序,您的加密密钥将在代码中,因此有人将能够找出它。他们是否会付出努力取决于你想保护什么。。。