您可以做任何事情来使用您的凭据,攻击者也可以这样做
混淆实际上给你带来了什么?时间。毕竟数据就在那里,你自己使用它的方案也是如此。有人弄清楚你的计划是什么只是时间问题。这一切都取决于您的偏执程度以及对您感到满意的风险程度的评估。特别是,您如何存储任何凭据应取决于谁有权访问运行数据库的机器。
尽管如此,橡胶最终还是要上路,所以继续前进吧。不要完全敲打混淆。只需确保将其与明智的做法相结合。
方法和建议
为每个帐户生成每个应用程序的 API 密钥,以供机器使用
如果您可以从第三方帐户生成 API 密钥,这将使您能够撤消对帐户的访问权限,而无需关闭所有潜在的应用程序。许多服务都有这些类型的 API 密钥(Google、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 密码保护。
不过,不要让这让您产生虚假的安全感。如果这是运行它的服务器,如果有人获得了对该盒子的网络访问权限,那么他们自己也可以访问密钥环数据。
设置授予访问权限的远程计算机
您能否设置一台机器,使用公钥和私钥对授予对凭据或解锁密钥的访问权限?
关于散列
如果您对用户名和密码进行哈希处理,您将无法取回它们。哈希被设计为单向函数。
您可以编码数据以进行混淆,但我不建议这样做。