先转一篇文章:
http://www.leiphone.com/no-safe.html
节选
写道
编者按:本文作者肖新光,网络ID江海客,安天实验室首席技术架构师,研究方向为反病毒和计算机犯罪取证等。如果有读者想要就安全问题和作者探讨,可以在微博@江海客。
我不得不惨痛地写在前面的是,这是一个安全崩盘的时代。过去一年,已经证实的遭遇入侵、并导致关键数据被窃或者被泄露的公司,包括索尼、世嘉这样的大型游戏设备厂商;包括花旗银行这样的金融机构,也包括了RSA这样的安全厂商。
这些事件中最令业界瞠目的是RSA被入侵,这直接导致多家工业巨头遭遇连锁的攻击,很多安全企业本身也使用RSA的令牌。比RSA弱小很多的荷兰电子认证公司DigiNotar已经在被入侵后,宣告破产。
就在2011年上半年,我们还是站在旁观者的立场讨论这些事情。但随即我们就遭遇了CSDN、多玩和天涯等等的数据泄露,其中最为敏感的,一方面是用户信息,另一个当然就是用户口令。由于身份实名、口令通用等情况影响,一时间人人自危。各个站点也陷在口水当中。
但实际上根据推断,这些入侵都是一些过去时,也就是说这些库早就在地下流传。同时流出,也许就是一个集体性的心理效应。
这种针对数据库记录的窃取,被一些攻击者称为“拖库“,于是有了一个自然而谐音的戏称“脱裤”。只是攻击者日趋不厚道,从前只是偷了人家的裤子,现在还要晾在大街上,并贴上布告说,“看,丫裤子上还有补丁呢”。
如果拖库是很难避免的,那么采用合理的加密策略,让攻击者拿到库后的影响降低到更小就是必要的。
明文存放口令的时代肯定是要结束了,但加密就安全么?
那些错误的加密策略
明文的密码固然是不能接受的,但错误的加密策略同样很糟糕。让我们看看下列情况。
简单使用标准HASH
我想起了一个90年代黑客笑话,有人进入一台UNIX主机,抓到了一个shadow文档,但破解不了。于是,他用自己的机器做了一个假的现场,故意留下这个shadow,最后看看别人用什么口令来试,最后再用这些口令与渗透原来的主机。遗憾的是,那时我们都把这个当成一个Joke,充其量回复一句“I服了you!“,而没有反思使用标准算法的问题。
目前来看,在口令保存上,使用最为广泛的算法是标准MD5 HASH。但实际上,很长时间,我们都忽略了HASH设计的初衷并不是用来加密,而是用来验证。系统设计者是因为HASH算法具有不可逆的特点所以“借”用其保存密码的。但其不可逆的前提假设,是明文集合是无限大的。但放到口令并不一样,口令的长度是受限的,同时其可使用的字符也是受限的。我们可以把口令的总数看正一个事实上的有限集(很难想象有人用100个字符作为口令)。
比如一个人的密码是“123456”,那么任何采用标准MD5加密的网站数据库中,其存放的都是这样一个MD5值:E10ADC3949BA59ABBE56E057F20F883E
由于密文均相同,加之HASH算法是单向的,因此攻击者较早使用的方法就是“密文比对+高频统计“后生成密文字典来攻击,由于绝大多数网站和系统的加密实现,都是相同明文口令生成相同的密文,因此,那些有高频密文的用户就可能是使用高频明文口令的用户。攻击者一方面可以针对标准算法来制定高频明文的对应密文档来查询,另一方面,对于那些非标准算法,高频统计攻击的方法也非常常见。
但查表攻击迅速压倒高频统计的原因,正是从2000年开始陆续有网站规模性明文口令泄漏事件开始的。在过去每一次明文的密码泄漏事件,攻击者都会把使用MD5、SHA1等常见HASH算法加工成的口令与那些采用HASH值来保存的库进行应对。
随着超算资源的廉价、GPU的普及、存储能力的增长,一个不容忽视的威胁开始跃上桌面,那就是,这些巨大的HASH表已经不仅仅是基于泄漏的密码和常见字符串字典来制作,很多攻击者通过长期的分工协作,通过穷举的方式来制作一定位数以下的数字字母组合的口令串与多种算法加密结果的映射结果集,这些结果集从百GB到几十TB,这就是传说中的彩虹表。
HASH的单向性优势在此已经只有理论意义,因为HASH的单向性是靠算法设计保证的,使用一个有限集来表示一个无限集,其必然是不可逆的。但攻击者是从查表来完成从HASH到口令明文的还原的。因此其算法的单向性也就失去了意义。
联合使用HASH
一些人误以为,HASH不够安全是因为HASH算法的强度问题,因此把MD5或者SHA1联合使用,其实这是毫无价值的(只是徒耗了存储资源)。如上面所说,HASH的不安全性在于大量口令与其HASH值的对应关系早已经被制作成彩虹表。只要你联合使用HASH的算法其中之一在彩虹表中,自然就可以查到了。
同理,那种采用“MD5的头+SHA的尾“之类的,或者采用其他的混合两个值的方法,也一样是没有意义的。因为攻击者可以很容易的观察到这种组合方法的规律,经过拆解后继续按照查表法破解。
...
...
Discuz7采用的加密方式为md5, md5(md5(password). salt) 值以及salt入库。用户登录时对明文口令先做md5然后提交,后台把提交过来的hash值与该用户数据库保存的salt字符串拼接后再次做md5,然后与数据库中的password值进行对比。
DZ的加盐字符串是6位字符,基本安全。但现在跑字典的越来越厉害,已经有专门针对DZ这种加密方式(准确说是散列方式)进行爆破(包括字典查询)的攻击方式。比如 http://www.cmd5.com/Default.aspx 网站就可选多种论坛软件加密方式字典查询。
虽然md5、sha1等摘要算法是不可逆的或者说是有损的,但考虑到用户口令长度有限,论坛上使用的一般不会超过20个字符。那么即使摘要算法不可逆,但此映射却基本是一一对应的——只要被拖到库,依据口令密文和salt值就可以[b]还原[/b]出你的明文口令。
要想避免这种情况那么就需要在对口令处理上进行其他有损
处理:
// Discuz默认口令入库处理方式
$passwd = md5( md5($passwd). $salt);
// 有损处理的口令入库方式:
$passwd = substr(sha1(md5($passwd). $salt), 0, 32) ;
改进的方式使用sha1算法主要目的并不是增加算法难度而是产生大于md5算法长度(32位)的字符串(40位)用于截取出标准md5长度字符串从而实现有损处理。这样处理的结果使得即使获得入库口令以及salt值也无法还原出用户原始明文口令,当然可以通过碰撞实现找到“可以通过登录验证的口令”,但用户原始口令安全性大大提高。
这种方式优点是sha1处理仅限于后台PHP流程中,不需要修改前台代码。
缺点是因为入库口令摘要方式变化,已经保存的口令将无法用于新方式验证,必须对 uc_client/control/user.php中 onlogin()函数做修改判断是否需要做DZ默认认证。 一个办法是数据库保存老的password及salt值,通过验证后写入新算法的值然后删除老的password及salt。
对加密、摘要算法不熟悉,不确定这种方式能否有效抵御字典攻击~
分享到:
相关推荐
Java MD5加密算法在Discuz用户表密码字段中的应用 MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它能将任意长度的数据转换为固定长度的输出,通常是一个128位的二进制数,常以32位的十六进制形式...
然而,随着技术的进步,开发者应关注并采用更现代的加密算法和库,以应对日益复杂的网络安全挑战。对于那些对加密算法有兴趣的开发者,可以进一步学习PHP的`password_hash()`函数以及其他加密解密技术,提升自己的...
然而,需要注意的是,尽管这种实现方式在大多数场景下足够安全,但对于极其敏感的应用程序,可能需要采用更强大的加密算法或更复杂的随机数生成策略。 2. **性能**:由于涉及到多次调用 `mt_rand()` 和字符串操作,...
标题 "Discuz加密解密函数 Java版" 涉及的是使用Java实现的与Discuz论坛系统相关的加密和解密功能。Discuz是一款流行的开源社区论坛软件,其内部使用了一系列的加密算法来保护用户数据的安全,例如用户密码、论坛...
《Discuz!数据库字段详解与应用》 Discuz! 是一款广泛应用的社区论坛软件,其数据库设计精细且全面,涵盖了用户权限、管理操作、社区内容等多个方面。本文将详细解析部分核心表及其字段属性,为二次开发提供参考。 ...
MD5本身存在一些弱点,例如碰撞攻击(即找到两个不同的输入但产生相同输出的情况),但通过添加随机的固定字符串和复杂化加密步骤,Discuz的加密规则提高了破解难度。 对于希望了解或者操作Discuz论坛密码与密保...
在IT行业中,论坛系统是社区交流的重要平台,Discuz! 是一款非常流行的开源论坛软件,深受许多网站管理员的喜爱。本文将详细介绍如何修改Discuz! 用户密码,帮助管理员或用户解决可能遇到的问题。 首先,理解Discuz...
6. **优化与安全**:讲解如何优化论坛性能,提高加载速度,以及防止SQL注入、XSS攻击等安全问题的策略。 7. **故障排查**:列举了常见的问题及解决方法,帮助用户快速定位并解决问题。 8. **FAQ与社区支持**:提供...
《Discuz!NT数据库部分字段详解》 Discuz!NT是一款基于PHP和MySQL的论坛系统,其数据库设计严谨,包含众多用于存储用户信息、论坛数据等的关键字段。本文将对其中的`dnt_users`表的部分字段进行详细解读,以帮助...
本文将深入探讨Discuz内容的经典加密方式,这是一种广泛应用于Discuz论坛系统中的加密技术,适用于对敏感信息进行保护。通过实例分析,我们可以了解如何使用PHP的authcode函数实现这一加密过程。 首先,我们看到一...
共六种PHP加解密方法, 其中包含非常给力的authcode加密函数,Discuz!经典代码(带详解) 函数authcode($string, $operation, $key, $expiry)中的$string:字符串,明文或密文;$operation:DECODE表示解密,其它表示...
2、口令保密:不保密时,会员可以知道口令内容并可以直接复制,如果保密了,会员就要想办法获取口令,这个也增加红包操作性 3、有效时间:从上次修改时间开始算起,超过有效时间自动归还剩余红包金额 it618帖子口令...
头像库4445张.zip"所代表的是一个专门为Discuz!论坛系统准备的头像资源集合。Discuz!是一款非常流行的开源社区论坛软件,它为用户提供了丰富的功能和自定义选项,包括个性化头像设置。 【描述】中的“各类头像库...
在众多加密算法中,Discuz加密算法作为讨论的重点,实际上是一种特殊的MD5加密实践。 MD5(Message-Digest Algorithm 5)是一种广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),...
《Discuz!数据库字段详解》 Discuz!是一款流行的社区论坛软件,它的核心功能和用户体验离不开背后的数据库支撑。本文将详细解析Discuz!数据库中的一些关键表及其字段,帮助我们理解论坛后台的数据组织和管理机制。 ...
discuz wry纯真ip库 discuz wry纯真ip库 discuz wry纯真ip库discuz wry纯真ip库