我可以隐藏我数据库中的哪个帐户是管理员帐户,这样攻击者就不会知道首先要破解哪个哈希?

信息安全 密码 哈希 数据库
2021-08-20 20:47:53

假设我有一个如下所示的数据库:

Name   Password hash (bcrypt)                                          Status
--------------------------------------------------------------------------------
Dave   $2y$10SyyWTpNB.TyWd3nM hQ41frOtObcircAb3nJw1Cf9dC6CT7tVIEb6XS   Standard
Sarah  $2y$10$fUJrNA200sXgWUJAP7XEiuq4itHa43Y8QVIpc/YWscgVJ PYWbLLV.   Admin
Mike   $2y$10$01jx7u7hnfKOzBYyjNWskOPQ23w1Cf1gNiv42wsKqXKOf8filzS02    Standard 

如果攻击者获得了对该数据库的访问权限,那么他们会立即看到 Sarah 是管理员,并且可能会专注于破解该密码,因此他们可以获得更多权力。有什么方法可以隐藏某人是否是数据库中的管理员,以便攻击者不知道管理员是谁?我可以简单地散列值(标准或管理员),但这只会产生 1 位熵,我希望获得比这更高的安全性。

4个回答

我会说考虑到你从中得到什么,这有点太麻烦了。我认为当攻击者可以访问数据库时,您会遇到更大的问题。混淆用户的管理员状态只会花费攻击者一些额外的时间,但 APT(高级持续威胁)可能不会被这一事实吓倒。

通过混淆实现的安全性充其量只能起到有限的作用——要确定它是否合适,您需要了解要应对哪些威胁。如果威胁参与者可以直接读取您的数据库,那么隐藏特定存储的详细信息有什么好处?

如果在混淆的好处(确保你真的可以证明这一点),然后使用该地址,这种威胁(加密值,离线的数据源,哈希等)混淆的类型。

我同意 Black Magic 的观点,它可能不值得这样做,但如果您愿意,您可以使用密钥派生函数根据密码制作加密密钥,并使用它来加密 Status 列的内容。

对于任何打开的用户会话,状态可能必须保存在内存中,因此这些会话仍然容易受到攻击者的攻击。

这意味着您将受到与攻击者相同的限制,假设您不知道您的用户密码。您将无法从数据库中读取状态,如果您想更改用户状态,则必须同时更改他们的密码。

许多现代系统实际上确实将用户的登录(他们如何验证)与他们的“配置文件”(他们拥有的权限)分开,实现为两个或多个离散系统。您的登录服务器可能只有一个 GUID、一个散列用户名和散列密码;成功登录后,将会话传输到应用程序服务器。只要您的应用程序服务器没有受到威胁,登录数据库即使被转储也毫无用处。

作为附加步骤,您还可以使用来自登录服务器的密钥(作为会话的一部分存储)来加密用户的数据,从而使应用程序服务器也更加安全。两个系统通常比一个系统更难击败。但是,如果您不愿意设置两台服务器(或集群),而且这一切听起来工作量太大,那么您可能最好还是使用当前的设计。仅仅知道要定位哪些客户并不会使工作变得更容易;如果攻击者可以破解其中一个,那么他们就可以通过并行计算破解所有这些。