1

我正在阅读有关将密码信息存储在数据库中的最佳方法,并且大多数示例都说我们不应该将实际密码存储在数据库中,而应该将哈希值和盐值存储在数据库中。在 Web 应用程序中,验证用户的代码位于服务器端,因此我们通过网络发送用户名和密码,在服务器上我们读取 salt 值,然后将接收到的密码与 salt 进行哈希处理,并进行比较在 db 中存储散列值。

如果应用程序位于客户端,并且应用程序直接连接到数据库,而不是通过某些服务(本地网络)怎么办?这意味着 Hash 类将在客户端公开,我需要从客户端上的 db 读取哈希和盐值,这允许任何人创建几行代码并获取客户端上的所有用户信息。

在这种情况下如何处理安全/身份验证?

4

1 回答 1

1

Windows 身份验证

如果应用程序在 Windows 域中运行,您可以使用经过身份验证的 Windows 用户信息。然后在数据库中不需要存储用户名/密码。您只需存储 Windows SID 即可在 User 表中识别用户。然后应用程序只需验证当前用户是否存在于数据库用户表中,如果不存在,则应用程序无法运行。

您可以使用WindowsIdentity.GetCurrent() (MSDN)获取当前用户信息,并且 User 属性将使您能够访问 SecurityIdentifier。在 C# 中将用户名转换为 SID 字符串的问题将向您展示如何将其转换为可以存储在数据库中的字符串。由于每个 Windows 用户都有一个唯一的 SID,因此可以轻松查找安全信息。

走这条路时,为了获得额外的安全性,最好对 SQL 连接使用集成安全性,然后锁定对查询和表的访问,以便只有某个用户组可以运行管理操作和添加用户,而普通用户只能对相关表执行读取和数据插入/更新语句。

编辑:

由于 Windows 身份验证不适合您,您可以让 SQL 在存储过程中为您执行哈希。通过使用哈希字节您可以将用户名/密码传递给存储过程,然后在 SQL 中完成验证,这样最终用户将永远无法看到逻辑。在存储过程中,您可以从表中提取 Salt 值或将其编码。例如,我们使用用户信息表中的用户名、密码和另一个值来创建被散列的值。这可以防止不同的用户拥有相同的哈希值,即使他们拥有相同的密码。我们还使用 SHA512 来生成哈希。然后你只需要锁定 SQL 访问,使用户无法连接到 SQL 并在存储过程上执行 Right-Click-->Modify 以查看源代码。这可能最适合您的情况。

于 2012-05-14T19:18:58.510 回答