验证直接连接到数据库的应用程序中的用户凭据(本地网络)

时间:2012-05-14 18:55:25

标签: c# security

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

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

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

1 个答案:

答案 0 :(得分:0)

Windows身份验证

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

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

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

修改

由于Windows身份验证不适合您,您可以让SQL在存储过程中为您执行哈希处理。通过使用HASHBYTES,您可以将用户名/密码传递给存储过程,然后在SQL中完成验证,以便最终用户永远无法看到逻辑。在存储过程中,您可以从表中提取Salt值或将其编码。例如,我们使用用户名,密码和用户信息表中的其他值来创建哈希值。这可以防止不同用户拥有相同的哈希,即使他们具有相同的密码。我们还使用SHA512生成哈希。然后,您只需要锁定SQL访问权限,以便用户无法连接到SQL并对存储过程执行右键单击 - >修改以查看源。这可能对你的情况最有效。