Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何保存SQL server密码_C#_Vb.net_Security_Encryption_Password Protection - Fatal编程技术网

C# 如何保存SQL server密码

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,这意味着任何登录到

我们有一个运行多个服务和可执行文件的应用程序。有些人需要访问SQL数据库,所以我需要将SQL server密码存储在某个地方。为了避免直接访问密码,密码被加密存储。要解密字符串,可以调用加密DLL,返回明文密码。困扰我的是,如何避免任何人都可以解密密码。以下选项已被讨论并放弃,因为它们不能解决或多或少直接访问明文密码的问题:

  • 加密dll包含解密密码所需的所有信息:任何恶意用户都可以使用自己的组件调用dll来解密密码

  • 使用DPAPI,我需要将作用域设置为LocalMachine,这意味着任何登录到本地系统的用户都可以解密密码

  • 2a。使用DPAPI和使用特殊帐户运行的服务组件可以解决“任何本地用户都可以使用DPAPI的非保护方法解密密码”问题,但是恶意用户仍然可以使用自己的组件调用加密服务

  • 加密DLL请求密码,并使用RijndaelManaged实例进行加密/解密。每个调用DLL的人都必须知道密码,这意味着我只是把问题转移到了另一个组件上

  • 集成安全不是选项,客户的安全策略拒绝使用是选项


  • 任何指针如何解决这个问题?

    这将取决于您认为系统中的用户在获取连接字符串时会走多远

    • 他们需要域访问才能使用您的应用程序吗
    • 能否将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身份验证并限制授予帐户的权限。没有密码,不需要加密,没有提升的机会。