安全存储无法加密的凭据

时间:2013-11-07 19:56:06

标签: database encryption passwords cryptography password-storage

我有一个客户端正在运行来自多个帐户的信息聚合器。数据库需要将用户名和密码存储到其他网站,以后可以通过脚本登录这些网站来检索数据。

我认为我们可以将它们哈希存储,而不是将它们存储为纯文本。显然,如果他们可以访问代码和数据库,有人仍然可以访问纯文本版本,但如果他们只有一个或另一个,则无法访问。

有更好的想法吗?

3 个答案:

答案 0 :(得分:2)

如果您的系统有密码,您可以使用它来生成密钥以加密/解密其他网站的密码。

这样,您需要用户输入该密码才能解密您在数据库中的密码。

这里有更详细的流程:

  1. 用户在登录系统时输入密码“123456”。
  2. 您使用“123456”密码的SHA256并获取密钥:“8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92”
  3. 使用“8d969 ...”密钥用AES解密数据库中站点的密码。
  4. 您可以通过多种方式对其进行优化。例如:在计算SHA哈希之前对密码进行盐化。

    作为此类腌制的实用示例,Michael建议使用PBKDF2并将HMAC - SHA-256作为其两个参数伪随机函数。

    其他增强功能:存储密钥的加密版本,以允许您的用户更改自己的密码,而无需重新加密所有密码......等等...

答案 1 :(得分:1)

您可以采取任何措施来使用您的凭据,攻击者也可以

混淆实际上会给你带来什么?时间。毕竟数据就在那里,你自己使用它的方案也是如此。有人弄清楚你的计划是什么只是时间问题。这一切都取决于您的偏执程度以及您对自己感觉舒适程度的评估。特别是,您存储任何凭据的方式应取决于谁有权访问运行数据库的计算机。

最终橡胶必须上路,所以出去征服。不要完全敲打混淆。只需确保将其与智能实践相结合。

方法和建议

为每台帐户生成每个应用程序API密钥,供机器使用

如果您可以从第三方帐户生成API密钥,则可以在不关闭所有潜在应用程序的情况下撤消对帐户的访问权限。许多服务都有这些类型的API密钥(谷歌,Twitter,StackExchange,Facebook和许多其他)。

您只需设置“应用程序”,然后使用消费者密钥和密钥以及访问令牌和访问密钥。机器只需存储这些凭据。如果发生折衷,您只需要撤销该组密钥。此外,这些允许您指定每个帐户的权限。

使用每用户密码作为其凭证集

当用户登录时,才会解锁他们的密码集。为此,您将根据正确的散列方案生成密钥,并在密钥前面执行几个散列步骤的验证检查。

无论如何在磁盘上加密

您始终可以使用一个密钥加密凭据。然后你只有一把钥匙来保护(保护所有其他秘密)。然后,您必须在访问其他凭据之前解密。

将秘密存储在系统的密钥环中

在Linux上,使用gnome-keyring。然后,您可以进行简单的Create-Read-Update-Delete调用,将其视为密码数据库。 Gnome密钥环基于PKCS#11标准。

gnome-keyring has an API用于保存到密钥环并检索项目。

/* A callback called when the operation completes */
static void
found_password (GnomeKeyringResult res, const gchar* password, gpointer user_data)
{
  /* user_data will be the same as was passed to gnome_keyring_find_password() */
  // ... do something with the password ...
  /* Once this function returns |password| will be freed */
}

static void
find_my_password()
{
  gnome_keyring_find_password (GNOME_KEYRING_NETWORK_PASSWORD,  /* The password type */
                               found_password,                  /* callback */
                               NULL, NULL,     /* User data for callback, and destroy notify */
                               "user", "me", 
                               "server", "gnome.org",
                               NULL);
}

在Windows 7+上,使用“加密文件系统”(EFS)功能。所有文件都使用证书加密,并使用您的Windows密码进行保护。

不要让这让你陷入虚假的安全感。如果这是它正在运行的服务器,如果有人获得了对该框的网络访问权限,他们也可以自己访问密钥环数据。

设置授予访问权限的远程计算机

您是否可以设置一台机器,使用公钥和私钥对授予对凭据或解锁密钥的访问权限?

On hashing

如果您对用户名和密码进行哈希处理,则表示您没有收回它们。哈希被设计为单向函数。

你可以编码数据以进行模糊处理,但我不推荐这样做。

答案 2 :(得分:-1)

如果您对信息进行哈希处理,则以后无法检索它。如果加密它,则需要将密钥存储在某处。除了物理限制对数据库的访问外,没有可靠的方法可以消除恶意使用数据的可能性。

哈希可以在所有可预见的方式中使用原始数据。但是,您需要使用数据。像SHA-256这样的加密哈希被设计成在计算上很难(没有制作不合理大小的查找表)来查找m给定H(m),其中H是你最喜欢的哈希函数。

如果你采用加密路线,你需要存储加密密钥,它可能会被破坏或至少用作解密oracle。您可以创建一个为您解密的服务代理,并使用客户端和服务器身份验证证书来确保安全。但是,如果有人妥协了授权客户端,那么您可以在妥协和检测之间留出时间窗口,从而可以破坏帐户。但是,即使您无法再访问受感染的客户端,此方法也可以灵活地撤销证书并立即拒绝服务器访问。

我建议设置一个只能通过直接连接(在同一物理交换机上)提供的远程服务,并且该服务向客户端验证自身并要求所有客户端进行身份验证。如果客户遭到入侵,或许限制它可以进行的查询数量也有助于防止滥用。该服务需要在每个请求中检查证书撤销。

此服务还需要连接到远程日志记录工具,该工具将用于独立审核系统。此日志记录服务需要再次验证客户端并使用客户端对自身进行身份验证。日志记录服务接收数据并将其附加到日志,它永远不允许修改或删除。收到日志条目后,它会对带有时间戳的日志条目进行数字签名,并将其输入审核容器。

这类似于证书颁发机构设置其审计证书颁发的文件记录的方式,以便为妥协提供最佳的恢复模型,因为实际上不可能防止泄密。