2011-01-05 132 views
2

我想编写一个C#应用程序,它需要连接到数据库并获取一些信息。我在想,如果我直接在C#应用程序中使用连接字符串,那么用户可能很容易获得连接字符串并直接登录到我的sql服务器,一旦发生这种情况,他们可以选择所有他们想要的信息!
那么有没有什么好的解决方案呢?
在此先感谢!我如何保密信息?

回答

1

我其实有类似的要求。我通过使用连接字符串并使用Rijndael加密逻辑对它进行加密来解决它(在System.Security.Cryptography中检查它)。它非常易于使用。我的一个朋友在过去的19个月里一直试图用一系列彩虹表来破解它 - 是的,他手上有太多时间 - 并且告诉我说“我们的太阳系在我之前可能会变黑可以进去。“我笑了。太多的空闲时间。

我只是把我的连接字符串,我存储在一个XML文件(所以我可以改变它,如果需要)并加密它。我的应用程序作为其初始化过程的一部分,读取此值 - 解密它 - 然后连接并打开数据库。

像“我是一块数据是被加密的” .....加密一次结束了类似.....“V27AsTNsJA + BEwoGR2PbiZum5puwiLbfMa41ens8r8sSiEnn6FiT + k8ImEft Qba8ziCpie94s3bEwcPekqRfhO1Noc8lVeERyezmtqN9/0ZgmzJbNbl/3emTLLfb0Qpj” .. ..这显然不会对试图入侵的人非常有用。

值得指出的是,即使使用低128位加密(这也支持256位),请记住有2个提升到128个可能值的功率,或者3.4e + 38。想想多么庞大的数字是:

340,000,000,000,000,000,000,000,000,000,000,000,000

如果试图破解这一点,例如,以每秒(1,000,000,000,000 /秒),1次万亿的尝试率就可能采取你3个亿亿几年才能得到它。当然,你可能会在第一次猜测中得到它......但可能不会。

256位密钥是1.15e + 77,512位密钥是1.34e + 154个可能值。

+0

就是这样,我也在做。 – TalentTuner 2011-01-05 03:29:26

+1

在初始化过程中,你说它解密连接字符串。这个解密密钥是否也存储在应用程序中,还是由您在运行时键入? – Jubal 2011-01-05 04:04:04

+0

@jskaggz - 我真的无法想象尝试键入一个键或IV ...你会做错误的分配(或至少我会)。它是应用程序本身的一部分,但如果有人试图对应用程序进行逆向工程以实现这一目的,则会受到混淆。实际上有几种处理这个问题的方法 - 我可以让我远程“推送”新的加密应用程序,因为加密也用于通信,并且交换加密使得任何人都无法穿透安全。 – BonanzaDriver 2011-01-05 04:31:41

6

解决此问题的唯一方法是三层体系结构,其中您的客户端软件不直接连接到数据库,而是连接到应用程序服务器,该应用程序服务器控制数据库凭据以及SQL发出的内容。

也可能(不太可能)限制客户端软件的数据库用户只能选择客户端应用程序真正需要的数据(而不是其他任何数据)的权限。通过这种方法,您将创建特定的视图并仅授予对这些视图的选择权限。存储过程是另一个工具。但是,这可能无法涵盖所有​​情况,并且在您意外授予太多或数据库中的错误允许特权升级的情况下有点危险。

但是,如果安全是一个问题,我会去三层。

+0

你的意思是我必须编写一个数据访问层并在该层上添加访问控制?那么每次我需要选择数据时,我都会首先发送用户名和密码,经过授权后我可以获得我有权限的数据? – MemoryLeak 2011-01-05 03:15:15

1

您需要加密web.config中的连接字符串。这里去吧Encrypt。此外,使用Windows身份验证(可信连接= true)。这可以确保即使用户拥有该凭证,如果未将其ID添加到ActiveDirectory/Domain中,他仍然无法登录。