【问题标题】:Verifying user credentials in application that connects to database directly (local network)在直接连接到数据库的应用程序中验证用户凭据(本地网络)
【发布时间】:2012-05-16 19:38:11
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# security


    【解决方案1】:

    Windows 身份验证

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

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

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

    编辑:

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

    【讨论】:

    • 我不能使用经过身份验证的用户信息,因为应用程序需要在应用程序运行时允许不同的用户登录/注销。还有什么其他选择?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2017-12-25
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    相关资源
    最近更新 更多