2012-05-14 33 views
0

我阅读存储在数据库中的密码信息的最佳方式,而且大部分的例子说,我们不应该存储在数据库中的实际密码的用户凭据,但哈希和盐值。在Web应用程序中,验证用户身份的代码位于服务器端,因此我们通过线路发送用户名和密码,并在服务器上读取salt值,然后使用salt接收我们收到的密码,然后比较它用db存储散列值。验证的应用程序连接到数据库直接(局域网)

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

如何安全/认证在这样的情况如何处理?

回答

0

Windows身份验证

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

您可以通过使用WindowsIdentity.GetCurrent() (MSDN)和用户属性将让你接触到的SecurityIdentifier获取当前用户的信息。 Convert a username to a SID string in C#这个问题将告诉你如何将它转换为可以存储在数据库中的字符串。由于每个Windows用户都有独特的SID,因此可以轻松查找安全信息。

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

编辑:

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

+0

,因为应用程序需要允许不同的用户登录/注销我无法使用验证用户信息,应用程序运行时。什么是其他的选择? – Goran

相关问题