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

本文关键字:应用程序 验证 用户 本地网络 连接 数据库 | 更新日期: 2023-09-27 18:34:11

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

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

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

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

Windows 身份验证

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

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

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

编辑:

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