问题描述
stringjmsql=(newMD5()).MD5Decrypt(ConfigurationManager.ConnectionStrings["SQLConnString"].ConnectionString,"**????#?");
我目前使用app.config,在里面把连接字段用md5加密了,然后在程序里使用此方法获取。但程序如果用Reflector打开,还是可以破解获取数据库账号和密码,有没有好一点的办法来解决安全问题?本人比较菜,也百度了好久,网上说的解决办法有些看不大懂。
解决方案
解决方案二:
会知道使用Reflector的人,你怎么加密都可以破解,因为C#语言本身是不加密的,只能想办法提高解密难度.直接放弃存储连接串,改用联机获取的方式,联机获取时要提供用于登录系统的用户名和密码,这样数据库连接密码可以经常改变,也可以记录下谁调用了获取连接串的方法,这需要另外编写一个服务端(如WEBSERVICE).
解决方案三:
引用1楼tcmakebest的回复:
会知道使用Reflector的人,你怎么加密都可以破解,因为C#语言本身是不加密的,只能想办法提高解密难度.直接放弃存储连接串,改用联机获取的方式,联机获取时要提供用于登录系统的用户名和密码,这样数据库连接密码可以经常改变,也可以记录下谁调用了获取连接串的方法,这需要另外编写一个服务端(如WEBSERVICE).
如何把数据库连接字符串放在webService里做常量,然后在winform里读取这个字符串可行不?这样是否安全?
解决方案四:
如果你都准备用webservice了,那么你已无需远程连接数据库了。
解决方案五:
不管你加密不加密,我们采用的方法与游戏破解类似,是在内存中获取真实的数据库连接串。因为你的程序最终总是要拿出真实的字符串去执行的。实际上,所谓加密应该是一个系统工程。最基本的做法就是放到一个局域网里,而这个局域网只有个别人能够触碰,并且保证经常更换防护方法(后者比前者更重要)。也就是说,从性价比上,非技术因素比技术重要得多得多。
解决方案六:
引用3楼ajianchina的回复:
如果你都准备用webservice了,那么你已无需远程连接数据库了。
是这样的。lz的思维,是一种“自底向上、堆砌”式的慢热的思维方式。因此即使别人跟他说webservice之类的话,它也是理解为用来传送一个数据库连接串而已,思维上离不开这个,要从根本上理解别的逻辑就好像割肉剜心一样难受,就会把相同的名词儿理解得黑白颠倒。其实如果能听进去不同的设计逻辑,一切就很自然。成本也低。比如说你老婆应该算是通常最能替你保守秘密的一个人了吧?但是如果你发现她跟旧情人还有约会(还好我没有发现过),这就难说了。所以不要相信虚伪的规则,任何人的思考都是有局限的,合适自己才最好。
解决方案七:
引用3楼ajianchina的回复:
如果你都准备用webservice了,那么你已无需远程连接数据库了。
主要是程序差不多算完工了,最后发现连接字符串放在app.config里不安全,所以想找个偷懒的办法解决安全问题。至于webservice也是今天上午才百度了解的,惭愧,自己接触C#才一个月的时间。
解决方案八:
引用6楼bh5768的回复:
Quote: 引用3楼ajianchina的回复:
如果你都准备用webservice了,那么你已无需远程连接数据库了。主要是程序差不多算完工了,最后发现连接字符串放在app.config里不安全,所以想找个偷懒的办法解决安全问题。至于webservice也是今天上午才百度了解的,惭愧,自己接触C#才一个月的时间。
今天偷点懒,以后可能有得麻烦了,4Lsp大神的意思你看了应该也明白,直白点讲,真不想让别人见到的宝贝就该放自己家里,若是揣兜里出门,随你藏的如何好,要想偷终究有办法,而且有好多办法,问题是被偷的结果会怎么样,先不谈技术性的问题,我给你举个例子,你的数据库连接账户可能都是用的一个登陆账户,我不是说的你软件业务上的账户,可能你们给不同的用户使用,但不想让各用户间相互知道对方的业务资料,但通过你的数据库账户登录进去了就可以查询了,全部一目了然,他也不会给你搞什么破坏,但这种结果有时所导致的损失是难以挽回的,所以你自己再好好想想,权衡一下利弊。
解决方案九:
连接字符串用c语言封进dll中会安全些吧?临时想到,没有验证
解决方案十:
你不要老想着加什么密。如果别人连你服务器都进不了,如何破解?不如你想想法子让服务器更安全更简单。
解决方案十一:
引用9楼u011710947的回复:
你不要老想着加什么密。如果别人连你服务器都进不了,如何破解?不如你想想法子让服务器更安全更简单。
是这样的吗?
解决方案十二:
引用10楼u010085567的回复:
Quote: 引用9楼u011710947的回复:
你不要老想着加什么密。如果别人连你服务器都进不了,如何破解?不如你想想法子让服务器更安全更简单。是这样的吗?
任何可逆加密都可以破解,与其把心思放在加密上,不如多花点时间防范别人入侵你的服务器。
解决方案十三:
引用6楼bh5768的回复:
主要是程序差不多算完工了,最后发现连接字符串放在app.config里不安全,所以想找个偷懒的办法解决安全问题。至于webservice也是今天上午才百度了解的,惭愧,自己接触C#才一个月的时间。
.net确实提供了配置文件的加密功能,请看这里的说明https://msdn.microsoft.com/en-us/library/89211k9b(VS.80).aspx但就象sp1234说的,连接字符串无论怎么加密,在客户端都有可能被读取,因为在运行时ADO.NET是需要明文的连接字符串,因此在内存中一定存有解密后的版本。别不相信,我就干过这事,我曾经用CheatEngine读取过某款软件的连接字符串,当然那是纯属好奇,玩玩而已。所以要避免连接字符串或其它敏感数据被非法获取,最好的办法是不要放到客户端,这就涉及到你的系统的架构问题。如果不把连接字符串放到客户端,就意味着所有对数据库的操作都要在服务端完成,这里至少有两个问题,一是你有没有服务端,二是怎么改变现有的数据访问模式。我想,这样的改变对于你已经开发好的系统来说是颠覆性的,要怎么做,还得自己权衡。
解决方案十四:
楼主只不过是突然想到要有加密的需求,但并不知道什么是加密!我目前使用app.config,在里面把连接字段用md5加密了但却不知道MD5并非加密,如果只是这样肤浅的去硬做,结果必然的自欺欺人的(自以为保护的秘密,结果却漏洞百出)
解决方案十五:
webservice放在虚拟主机上能用吗?还是必须要有虚拟目录?
解决方案:
引用12楼effun的回复:
Quote: 引用6楼bh5768的回复:
主要是程序差不多算完工了,最后发现连接字符串放在app.config里不安全,所以想找个偷懒的办法解决安全问题。至于webservice也是今天上午才百度了解的,惭愧,自己接触C#才一个月的时间。.net确实提供了配置文件的加密功能,请看这里的说明https://msdn.microsoft.com/en-us/library/89211k9b(VS.80).aspx但就象sp1234说的,连接字符串无论怎么加密,在客户端都有可能被读取,因为在运行时ADO.NET是需要明文的连接字符串,因此在内存中一定存有解密后的版本。别不相信,我就干过这事,我曾经用CheatEngine读取过某款软件的连接字符串,当然那是纯属好奇,玩玩而已。所以要避免连接字符串或其它敏感数据被非法获取,最好的办法是不要放到客户端,这就涉及到你的系统的架构问题。如果不把连接字符串放到客户端,就意味着所有对数据库的操作都要在服务端完成,这里至少有两个问题,一是你有没有服务端,二是怎么改变现有的数据访问模式。我想,这样的改变对于你已经开发好的系统来说是颠覆性的,要怎么做,还得自己权衡。
现在在做升级版,数据处理放在webservice里。但有个疑问,webservice必须放在虚拟目录里才可以允许吗?