为了防止某些别有用心的人从外部访问数据库盗取数据库中的用户姓名密码信用卡号等其他重要信息在我们创建数据库驱动的解决方案时我们首先需要考虑的的第一条设计决策就是如何加密存储数据以此来保证它的安全免受被他人窥测
SQL Server中有哪一种支持可以用于加密对象和数据?从一开始就讨论一下SQL Server欠缺什么是明智的或者是对于SQL Server中的加密部分你不应该做什么
首先SQL Server有两个内置的密码函数——即pwdencrypt() 和 pwdcompare()同时还有两个SQL Server用来管理密码哈希的没有正式记录的函数:pwdencrypt() 将密码哈希过后进行存储; pwdcompare()将提供的字符串与哈希后的字符串进行比较不幸的是这个哈希函数不是非常安全它可以通过字典攻击算法被破解(类似命令行应用程序!)
这些函数随着SQL Server的版本发展而不断进行修改这也是另一个没有使用它们的原因早期版本的SQL Server对密码进行的哈希在后来的版本中无法解密所以如果你依赖一个版本中的函数那么当升级的时候所有你的加密数据就都没有用了除非你可以首先对其解密——这也就违背了加密的最初的目的
第二你可能会尝试去创建一个针对你的数据库的自制的加密解决方案但是有以下三个理由说明你不要这样做:
除非你是加密专家否则胡乱编写的加密系统只会提供非常低级的价值不高的保护新鲜的是单向密码哈希或者 ROTx 形式的加密几乎不需要费事就可以被轻松打败
如果由于你自己的能力的缺乏而导致加密被破解那么你的数据就完蛋了你需要将所有的东西进行没有加密的备份是吗?(即使你加密了那里有没有安全漏洞?)
当市面上提供有专业级别的具有工业强度的加密解决方案的时候你就不值得花费时间去自己做把你的时间用于构建一个好的坚固的数据库而不是再重新发明一次车轮
那么什么才是好的加密数据的方式呢?
对于新手微软提供了一个自己生成的加密解决方案CryptoAPI 对于轻量级的加密军用级别的安全就不在考虑范围之内它具有相对容易实现的优势:管理员可以安装一个名为CAPICOM 的ActiveX 控制它可以在TSQL存储过程中提供CryptoAPI 功能CAPICOM 支持各种类型的双向加密和单向哈希算法所以管理员可以挑选最适合应用程序的问题的部分
如果你对使用微软的解决方案不感兴趣还有一些很好的第三方的方案可以使用一家名为ActiveCrypt 的软件有限责任公司制造了XP_CRYPT 它是SQL Server的插件可以在视图程序和触发器中通过扩展存储过程和用户自定义函数(在SQL Server 中)来完成加密你可以下载一个支持无线的MDDES 以及SHA哈希的免费版本的应用程序; 其他的加密模型就是在比特深度上进行的(完全版本是无限的)在你自己的代码中你可以使用XP_CRYPT与ActiveX 控制一样(在受限的免费版本中)对于ASP程序员来说一个名为AspEncrypt 的组件提供了一种将高级加密整合到你的代码中的简单方式
对数据库文件自身进行加密或者提供传输层上的安全保护怎么样?对于前者大家可以在Windows系统中持续使用加密文件系统然而你必须保存加密密钥的备份在出现问题的时候这个数据有可能会丢失对于后者有IPSec和SQL Server自己的SSL加密都是SQL Server和Windows自带的大家的主要精力应该放在避免以明文存储敏感数据因为从数据库中抽取没有加密的数据同样是最容易受到攻击的薄弱环节