首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

1.3.1  存储密码

小结:对于应用程序和其他人来说,存储在数据库中的密码是一种危险

威胁:账户劫持、潜在的可能性

2001年2月,使用简单关键字替换复杂Web地址的RealNames公司宣布电脑黑客访问了该公司的客户数据库,并且公布了所有客户的信用卡信息和密码。一个月后,Web主机提供商ADDR.com宣布,一个电脑黑客窃取了大概46 000名客户的个人信息和密码。在这之后,我们经常会听到有关侵入服务器并窃取密码的类似事件。

使用一种简单的策略,可极大地减少这些类型攻击所带来的风险:不要在数据库中存储密码。

下面是存储密码,以备以后验证用户时使用的3种方法:

n 可以自己将密码本身存储为普通文本。

n 可以加密密码,并存储加密文。

n 可以创建一个单向的密码哈希(hash),并且将这种哈希表存储在数据库中。

显然,第一种解决方案很危险,而第二种也不是非常好:虽然加密了密码,但这种加密基于密钥。如果Web应用程序必须执行这种加密和解密,则该应用程序必须以某种方式存储该密钥。如果电脑黑客控制该应用程序,并且该应用可以解密密码,则电脑黑客就可以解密任何密码。

哈希称做单向函数,因为可以从密码中派生出一个哈希,但却不可以反向运用该算法,从哈希中获得密码。然而,哈希并不能完全屏蔽攻击,仍然要仔细加以防护。如果攻击者可以获得哈希,就可以扫描大量单词列表,通过相同的哈希算法处理每个单词,并且比较两个哈希,直到发现匹配。许多密码解密程序都使用这种攻击方法,例如John the Ripper①和黑客组织10pht开发的破解软件。

不存储实际密码的一个重要原因是:如果这样做,组织内成员就不可能访问用户密码。这一点非常重要,因为用户很少针对不同的系统而使用不同的密码。如果组织中的某些人已经拥有访问应用程序中密码的权限,这可能意味着,这些人也具有访问其他Web系统上用户账户的权限。

如果将密码存储在数据库中,攻击者就可以获得访问所有用户账户的权限,即使这些密码已经被加密。这将使所有用户处于危险之中,特别是当他们在其他系统上也使用了相同的密码时,而许多用户都会这样做。一些电脑黑客收集大量用户名和密码组合的列表,使用该列表对其他系统进行暴力攻击。

找出可以最佳运用于组织的哈希算法。哈希依然容易受到暴力攻击,因此最佳的解决方案通常并不是具有最佳性能的算法。在这种情况下,较慢的算法意味着暴力攻击的过程需要更长的时间。设计系统时,要做到永远不会实际找回密码,而应该只是设置或重置密码。

然而,在很少的情况下,应用程序必须存储密码以备后面使用。例如,我曾经审核一个必须验证第三方数据提供者的应用程序。因为数据提供者需要验证,该应用程序必须使用可逆的加密方法存储密码。因为应用程序需要可检索的密码,公   司必须采取额外的措施来保护加密密钥,也就是将加密和解密代码放在一个COM组件中。

在Web应用程序中,使用可逆加密方法的一个弱点是:在实际情况中,加密密钥很少改变。问题在于,如果希望改变加密密钥,则必须解密数据库中的所有密文,然后使用新的密钥重新加密——很少有Web或数据库应用程序被设计用来处理这种情况。如果计划使用可逆加密方法,也需要计划使用一种机制来定期改变加密密钥,并且更新所有加密数据。

如果打算使用可逆的加密方法,则应该总是使用DES、Blowfish或其他已证明安全有效的强加密算法。绝对不要使用XOR、ROT-13或自己开发的加密代码。这些算法通常提供很少的保护,并且比人们所想像得更容易被破坏。弱加密算法大概等同于大多数行李箱所带有的小锁——甚至无法阻止最业余的窃贼。

使用单向哈希函数并将哈希存储在数据库中。当用户登录时,对用户输入的密码运行哈希函数,并且将所得到的哈希和数据库中的哈希进行比较。哈希函数的一个优点是,它们只由数字和字母组成,并且允许用户输入任意的键盘字符作为他们的密码,而不需要采取额外的方法来处理特殊的字符。

如果有一个存储普通文本密码的现有系统,则转换为哈希的过程将相对比较简单。为了做到这一点,在已有密码字段后面创建一个新的哈希字段。接下来,将哈希函数添加到验证代码和密码设置代码中。最后,并不存储和检查密码字段,而是更新代码,以首先对密码进行哈希,然后使用哈希字段存储并   检查。

请参阅第4章“加密私有数据”,其中讲解了更多使用.NET框架提供的加密特性的知识。

安全策略

n 绝对不要在普通文本中存储密码,也不要使用可逆加密方法。

n 使用强哈希算法,例如MD5,SHA-1,SHA256或SHA512。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论