我曾尝试阅读有关这方面的不同解决方案,并且我知道要走的路在很大程度上取决于每个单独的场景。这是一个很好的链接:http: //msdn.microsoft.com/en-us/magazine/cc164054.aspx。
我将不胜感激有关此特定情况的一些专家建议。
设想:
带有 sql 紧凑型数据库的 WPF 应用程序,该数据库将分发给具有本地管理员权限的客户端。该应用程序不能一直依赖互联网连接。没有,除了应用程序本身应该能够访问数据库。那么,最好的情况是什么,或者最坏的情况是什么?我的意思是这样用户就无法获得数据库凭据。
编辑:数据库是引擎默认加密的,并且有一个强密码。
选项:
- 使用受保护的配置加密配置文件部分 ( http://msdn.microsoft.com/en-us/library/89211k9b(v=vs.80).aspx )
- 使用 DPAPIProtectedConfigurationProvider(使用客户端密钥):
- 优点:更难拿到钥匙......??或者当用户具有本地管理员权限时可能没有..?
- 缺点:连接字符串只能在加密的计算机上解密。必须在客户端计算机上加密。当应用程序第一次运行时,或者在使用 MSI 安装时使用自定义操作。如果您知道在执行之前必须查看它们,那么它们很容易获得连接字符串。
- 使用 RSAProtectedConfigurationProvider(使用提供的密钥):
- 优点:数据在分发时是加密的
- 缺点:密钥必须存储在某个地方,并且更容易妥协..?? 只要用户具有本地管理员权限,与 DPAPIProtectedConfigurationProvider 可能没有区别..?
- 使用 DPAPIProtectedConfigurationProvider(使用客户端密钥):
- 使用 Windows 安全:
- 缺点:用户可以使用自己的凭据轻松连接到数据库。所以这不是一个选择。
- 数据隐藏:
- 缺点:通过示例进行逆向工程时,易于掌握连接字符串。这不是独立的选项。
- 其他选择?
我看到很多示例,其中建议使用 DPAPIProtectedConfigurationProvider 并在第一次执行 app.config 时或在安装期间使用自定义操作加密连接字符串。
好吧,我认为最糟糕的选择是使用 RSAProtectedConfigurationProvider 加密 app.config 并使用每次生成的自定义 RSA 密钥(使用每次使密钥相同的逻辑)。然后所有这些代码都被混淆了。这样,app.config 可以与加密的连接字符串一起分发。
我知道凭据仍然可能被泄露,并且在这种情况下无法避免 100%。一切都是为了选择最差的选项。
现在我会很感激你的意见......谢谢!