我在Windows 2008 R2计算机上运行了一个SQL Server,需要在其上运行基本查询(SELECT / INSERT / UPDATE)。这些操作由客户端直接执行,客户端是用C#编写的应用程序,安装在不同位置的一台计算机上,因此连接是通过Internet进行的。
由于在DB上运行的操作的性质非常简单,我宁愿不在SQL Server上编写后端。所以安全设置:
1)用户名和密码写在客户端并提交。
2)在服务器上运行(参数化)查询,并将密码哈希和盐返回给客户端。
3)附加密码和salt,使用SHA_512进行哈希处理,并与密码哈希进行比较。
4)如果两者匹配,您可以访问创建和发送查询的工具集。
在稍微研究一下这个话题后,我觉得这个系统存在一些安全漏洞,但我无法准确指出这些漏洞可能是什么。
答案 0 :(得分:2)
根据您的方案,我会考虑为您的应用程序的每个用户创建SQL帐户。当用户登录到您的应用程序时,在构造SQL Server连接字符串时使用这些凭据并允许服务器执行凭据验证。这通常被称为pass-thru身份验证。
更好的是,如果您的应用程序将由与SQL Server相同的Active Directory域上的用户执行,您可以使用更安全的Windows集成安全性(您当前用于本地测试的那些),并且用户将不需要完全登录。该连接将仅使用其当前的AD凭据。有关使用Windows域凭据在SQL Server中设置用户帐户的详细信息,请参阅此链接:https://msdn.microsoft.com/en-us/library/dd787978.aspx
此外,使用任一选项,您仍然希望使用受TLS保护的连接(Encrypt = true)来帮助防止通过网络窥探凭证。
答案 1 :(得分:0)
如果我理解正确,那么整个密码检查在客户端完成。那是对的吗?如果是这样,它似乎可能不安全。
你完全相信客户本身吗?如果未经授权的人可以访问客户端,或者创建另一个模仿客户端的客户端,那么这会大大增加他们访问服务器端的机会。
毫无疑问,创建后端系统会更安全,即使它只是一个非常简单的代理服务,只需检查用户名和密码,然后按原样转发查询本身。
这样,密码哈希和盐永远不会离开服务器。
答案 2 :(得分:0)
直接连接到SQL Server的客户端不安全。如果客户端位于本地硬盘驱动器上,则可能会被黑客入侵。
你没有找到你想要做的工具,因为它不是一个好的设计。
不要理解“由于在DB上运行的操作的性质如此简单,我宁愿不在SQL Server上编写后端。”如果这很容易那就是设置后端的原因。
.NET拥有完整的基础架构。 Windows Communication Foundation。