登录-将用户数据传递到新窗口/将其存储为静态信息?[桌面应用程序] 我试图用一个身份验证系统来制作一个桌面C++应用程序(使用Qt,如果这个问题很重要)。它一次只能由一个用户使用。当应用程序启动时,登录表单将允许用户键入用户名和密码。登录后,将显示一个新窗口。我的问题是:我应该将用户的ID和/或用户名[作为构造函数参数]传递给下一个窗口(并将这样的系统也用于其他窗口),还是可以(我更喜欢这样)将这些数据存储在类的静态字段中并从任何地方访问它们?[听起来还不错,因为我在任何时候只允许一个用户登录]。我还应该提到,我将尝试使用模型-视图-控制器模式。

登录-将用户数据传递到新窗口/将其存储为静态信息?[桌面应用程序] 我试图用一个身份验证系统来制作一个桌面C++应用程序(使用Qt,如果这个问题很重要)。它一次只能由一个用户使用。当应用程序启动时,登录表单将允许用户键入用户名和密码。登录后,将显示一个新窗口。我的问题是:我应该将用户的ID和/或用户名[作为构造函数参数]传递给下一个窗口(并将这样的系统也用于其他窗口),还是可以(我更喜欢这样)将这些数据存储在类的静态字段中并从任何地方访问它们?[听起来还不错,因为我在任何时候只允许一个用户登录]。我还应该提到,我将尝试使用模型-视图-控制器模式。,c++,oop,user-interface,model-view-controller,login,C++,Oop,User Interface,Model View Controller,Login,是否需要存储它?我的意思是,一旦用户在您的登录对话框上单击“登录”,它将检查输入的名称/密码组合是否有权使用该应用程序,然后启动该应用程序的其余部分,知道用户已获得授权,并且无需任何其他检查/使用凭据 如果您确实需要存储用户名(例如,您在标题中的某个位置显示用户以XXX身份登录,或者您出于其他原因使用它),我建议将其静态保存在某个位置。另一种方式(到处传递)意味着您必须在应用程序的其余部分存储userID/name副本 此外,如果您有更多与用户相关的信息(如所选主题、某些配置、用户特定的文件路径

是否需要存储它?我的意思是,一旦用户在您的登录对话框上单击“登录”,它将检查输入的名称/密码组合是否有权使用该应用程序,然后启动该应用程序的其余部分,知道用户已获得授权,并且无需任何其他检查/使用凭据

如果您确实需要存储用户名(例如,您在标题中的某个位置显示用户以XXX身份登录,或者您出于其他原因使用它),我建议将其静态保存在某个位置。另一种方式(到处传递)意味着您必须在应用程序的其余部分存储userID/name副本

此外,如果您有更多与用户相关的信息(如所选主题、某些配置、用户特定的文件路径等),请将其保留在一个位置(创建包含所有这些内容的结构/对象)

专业提示#1:

不要在该结构中存储密码。检查用户是否已授权后,将其转储。我的意思是不要停止使用它/忘记指针,而是覆盖内存中存储密码的所有位置,以防止一些RAM读取攻击

// Example
char *password = getPasswordFromLoginDialog();

// Do some stuff (check it)

while (*password) { // while we are not at the end of 0 terminated string
    *password = 0; // zero it
    password ++; // move on
}
专业提示#2:

比较两个字符串的通常方法是逐字符进行比较,一旦它们不相同,则说明两个字符串不同,因此不接受密码。然而,在第7位发现字符匹配错误所需的时间比在第1位稍长。攻击者可以使用蛮力和统计数据攻击该漏洞,并逐个计算出密码

解决这个问题的简单方法是:用户尝试登录后,等待一段随机时间,然后开始检查密码是否正确。这样它将破坏这种基于时间的暴力攻击

检查密码是否正确的更合适的方法是:不检查实际密码,但首先使用一些加密安全哈希(如SHA256)对其进行哈希,然后比较哈希。最好是散列和散列的散列,以此类推,大约1000倍,所以如果攻击者获得原始密码散列,则需要更长的时间进行暴力攻击

专业提示#3:

永远不要将用户名/密码硬编码到应用程序中。反编译并从中提取这些对非常容易。我不知道您正在做什么,但我建议您从一些SQL数据库或类似的数据库中查询1000次密码哈希。如果您必须使用硬编码密码,请不要使用原始字符串,而是使用散列

专业提示4:

使用盐()。在散列密码之前,您在密码前/后添加了一些随机数据。为了增加安全性,最好为每个用户分配不同的salt。 之所以使用salt,是因为相同的密码具有相同的哈希值。当您有常用密码和散列的查找表时,您可以非常轻松地对密码进行反散列。不为每个用户使用不同的salt(或根本不使用salt)会产生一些后果:当密码泄漏(散列)时,数据库攻击者会立即知道哪些用户拥有相同的密码

专业提示#5:

如果您使用的是某种类型的客户机-服务器授权系统,请确保在客户端(通过网络发送密码之前)和服务器端(存储到数据库/与数据库进行比较之前)使用salt哈希密码。这样,当数据库泄漏时,攻击者就不能使用这些存储的散列来授权自己,因为在实际授权过程之前,这些散列会在服务器端再次被散列(一次)。 请记住,若攻击者在客户端将盐散列密码发送到服务器时截获该密码,他可以使用该密码对自己进行授权。但是,在使用网络时,您应该将所有流量封装在某种加密隧道中(请看)


希望这有帮助

非常感谢您的帮助,我很高兴知道保持信息为静态不是一个坏主意(是的,我确实需要进一步了解这些信息)。另外,感谢您提到struct,我似乎忘记了struct:)。我也对密码擦除部分感到惊讶。我怀疑我曾经想过从RAM中读取它的可能性。是的,对于从RAM中读取的其他进程,人们不会三思而后行。我最近一直在开发一个我希望非常安全的应用程序,除了显而易见的密码(密钥记录,…)之外,攻击者还有很多可能的方法来破解密码;我将在我的答案中添加更多专业提示。。。