日期:2014-05-18  浏览次数:20547 次

桌面程序连接mssql安全问题
程序要连接到远程的数据库进行常规的数据库操作:
C/C++ code

strTemp.Format(_T("Provider=SQLOLEDB.1;Initial Catalog=\"数据库名\";Data Source=%s,%d"),strDBIP,m_uDBPort);
            _bstr_t strConnect=strTemp;
            _bstr_t strUser = App->m_strDBUser;
            _bstr_t strPass = App->m_strDBPass;
            hr = m_pConnection->Open(strConnect,strUser,strPass,adModeUnknown);//直接连接数据库


1.数据库名, 用户 , 密码 : 总不能写死在程序里边吧? 这样网络截个包就看见了, 不安全
2.在网上查了一下, 发现有以下几种方法:
  a) (Client <---> DB)数据库里面设置好权限, 为每个客户分配一个数据库用户, 缺点: 如果客户多, 岂不是数据库里面要建立很多个用户?
  b) (Client <---> DB)把数据库连接串加密保存到注册表或磁盘文件中, 感觉这个也不很好
  c) (Client <---> Server, Client <---> DB) 二次登陆: 首先客户端程序用账号A登陆到服务器, 服务器依据A检索数据库并返回该用户对应的加密后的数据库用户名B和密码, 客户端程序解密并用真正的用户B登陆到数据库

以上三种都存在安全问题, 虽然没有决定的安全, 可是力求更安全, 希望大家能帮帮分析一下, 看哪种方式更好, 或者有什么更好的方法去更安全的连接数据库呢?

------解决方案--------------------
提供一种思路:
客户端存一对加密键值,用于用户登录时调用服务器的凭证,用户认证通过web service或wcf方式,最后,在客户端自加密存储这一对键值。
升级时客户端会自动更新这对加密键值。
------解决方案--------------------
对密码进行字符串加密。
------解决方案--------------------
其实我想突破一下,不从程序方面去考虑,从DBA的角度考虑的话

如果是sql server 2008 那我就有TDE的方式将数据库加密,只有获得令牌的用户才能访问,没有的用户

则不能访问