C# 如何保存SQL server密码
我们有一个运行多个服务和可执行文件的应用程序。有些人需要访问SQL数据库,所以我需要将SQL server密码存储在某个地方。为了避免直接访问密码,密码被加密存储。要解密字符串,可以调用加密DLL,返回明文密码。困扰我的是,如何避免任何人都可以解密密码。以下选项已被讨论并放弃,因为它们不能解决或多或少直接访问明文密码的问题:C# 如何保存SQL server密码,c#,vb.net,security,encryption,password-protection,C#,Vb.net,Security,Encryption,Password Protection,我们有一个运行多个服务和可执行文件的应用程序。有些人需要访问SQL数据库,所以我需要将SQL server密码存储在某个地方。为了避免直接访问密码,密码被加密存储。要解密字符串,可以调用加密DLL,返回明文密码。困扰我的是,如何避免任何人都可以解密密码。以下选项已被讨论并放弃,因为它们不能解决或多或少直接访问明文密码的问题: 加密dll包含解密密码所需的所有信息:任何恶意用户都可以使用自己的组件调用dll来解密密码 使用DPAPI,我需要将作用域设置为LocalMachine,这意味着任何登录到
任何指针如何解决这个问题?这将取决于您认为系统中的用户在获取连接字符串时会走多远
- 他们需要域访问才能使用您的应用程序吗李>
- 能否将IP地址限制到SQL server中李>
- 用户在他们的机器上有管理员权限吗
- e、 t.c
- 将键和IV移到DLL外部,因为如果其被窃取,这似乎是单点故障
- 混淆应用程序代码中的密钥和iv或存储在证书中,可能使用DPAPI
- 锁定对程序文件的访问,使应用程序在受限用户下运行
您可以将加密dll的当前公共接口设置为仅限内部。 然后,使用
InternalsVisibleTo
属性,可以指定一个或多个可以实际查看这些内部接口方法的特定程序集
这将允许您限制对加密库的访问
此处参考:
编辑1
唯一的缺点是,如果恶意用户要反编译您的加密dll。
虽然您可能会使这一点难以实现,但在.Net中却无法完全避免
此外,您没有提及风险级别(内部/公司应用程序、公开应用程序等),这使得提供最佳答案非常困难
(我说的是最佳答案,因为任何加密都无法保证:)如果它是一个公开可用的应用程序,那么最好避免在winform应用程序本身中存储任何SQL连接字符串详细信息 相反,托管winform将通过的web服务。
这将确保恶意用户无法获取您的SQL连接详细信息(至少不能从winform应用程序或相关DLL获取),并允许您将SQL server隐藏在远离网络的地方
有许多方法可以保护web服务,使其只能由“批准的”客户端访问。(用户身份验证令牌等)您可以创建存储的过程来读取和写入数据,然后只授予对这些过程的访问权限。首先,不要使用SQL Server身份验证,使用Windows身份验证。没有密码以这种方式存储。然后仅向授权用户授予权限。您可以创建一个Windows组,将所有用户放入其中,并仅将该组添加到数据库中。或者,您可以创建DB角色并在其中添加用户。最后,不要让每个人都成为数据库所有者——只给他们所需的权限。如果您有组或角色,那么这很容易,您只需要为角色分配权限,而不需要为单个角色分配权限accounts@SurfGrobi写入数据库并不意味着用户可以滥用任何内容或提升任何写入。即使您将帐户
dbwriter
提供给数据库,他也只能写入该数据库,不能提升任何内容。@Sk93完全没有误解。仅仅因为顾客想要一枚手榴弹作为花盆,并不意味着你应该给他一枚。无论采用何种手工编码加密方式,都将解决使用几乎硬编码的单一帐户所固有的不安全问题password@SurfGrobi客户在集成安全方面的具体问题是什么?我怀疑他们是否有政策规定“确保弱身份验证,并使用几十个硬编码密码,这些密码需要管理员更改和知道”。对于这种明显不合逻辑的要求,几乎总是有不同的原因,例如:客户希望远程用户在没有VPN的情况下连接,或者客户购买了SQL Azure但不想为广告付费。或者客户可能只是误解了安全性,或者使用Windows身份验证并限制授予帐户的权限。没有密码,不需要加密,没有提升的机会。