以纯文本格式存储安全问题的答案是否不好?

信息安全 密码 秘密问题
2021-08-30 19:41:31

如果安全问题的输入完全是数字化的,那么安全问题的答案是否应该在身份验证服务器上进行散列(或至少加密)?

4个回答

我假设您要防御的模型是攻击者可以访问数据库的地方。如果是这样的话,是的,如果攻击者知道这些细节就可以破坏帐户,那是个坏主意。

我的建议是将答案转换为大写,然后加盐 + 散列。还可以选择修剪它或折叠所有空格。这在不降低可用性的情况下提供了合理的安全措施。

如果这些问题提供与密码相同的访问级别,那么出于所有实际目的,它们都是密码,应该被视为一个密码。对您存储的所有密码应用相同级别的保护。

答案是肯定的,你应该总是散列 this

为什么我们要散列密码之类的东西?两个原因:主要是因为人们经常在许多不同的事情上使用相同的密码,另外(这更像是一个幸运的副作用)防止攻击者在获得只读数据库访问权限时登录。

所以你不认为用户的第一只宠物或母亲的娘家姓也是他将在多​​个服务中使用的数据吗?或者这可能被用于社会工程攻击?或者可以用来重置密码并获得访问权限?

出于这个原因,您应该像处理密码一样保护安全问题的答案免受攻击者(和管理员!)的攻击。

为什么不加密呢?

加密是可逆的,它可以在不需要时访问数据。您试图通过保护数据库数据来防止的一种情况是服务器遭到破坏或内部人员有不良意图的情况。在这两种情况下,他们都可以使用解密密钥来逆转保护。有了像样的散列,这不再可能。

但是标点符号呢?除非它是精确的,否则您无法匹配哈希。

人们可能会在答案中使用多个单词,有时他们可能会使用大写字母,有时他们可能会删除单词之间的空格或在句子后面加上句号......所以我建议将其标准化以至少删除空格,删除标点符号并将任何大写字母小写。

无论您是存储明文还是加密,您都需要编写一个规范化算法来比较它们(这样就可以进行小写之类的操作)。该算法会将其归结为一个基本版本,以便能够决定它是否匹配。如果在散列结果之前应用它,它的工作原理是一样的。

PS。不要做安全问题。由于很多原因,它们非常糟糕但是,如果您确实使用了它们,那么至少要稍微保护您的用户并散列答案。

正如@Polynomial@B-Con所提到的,如果安全问题可以有效地用作密码,那么存储未加密的安全问题是很危险的。但即使不是这种情况,您也不应该存储未加密的安全答案。

常见的安全问题要求提供个人详细信息,例如“你妈妈叫什么名字?” (假设您无法在其中放置自定义问题或用户仅选择现有问题之一的系统)。您不是唯一可能要求提供该详细信息的服务器,相同的信息可用于破坏具有相同安全问题和答案的其他系统上的信息。