微博发了一道安全常识题,从反馈看,搞不太清楚的人还是蛮多的。
有意思的是,搞不清楚的人多数认为是我搞错了。微博就144个字,也说不开,挪这里详细说说。
很多网站都有用户系统,有用户系统就有密码存放,通常,密码都是加密传输的,为了安全,通常是单向散列加密,或者说,不可逆加密,一个简单的判断是,你通过密码找回功能操作,如果让你重设密码的,基本上是不可逆加密的,直接给你密码的,都是明文或可逆加密的,这种都非常危险。
用户系统面临的风险大体包括
1:弱口令扫描
2:注入
3:侦听
4:爆库
5:社工库扫描
此外XSS蠕虫或其他溢出神马的,限于篇幅,在这就不多提了。
目前玩弱口令扫描的少了, 因为投入产出不经济,注入是另一个话题,本文不提,侦听要特别强调一下,不但存储要注意安全,在传输和用户录入过程中的安全也非常关键,这也是类似支付宝,银行网关等产品经常要安全控件的原因,而作为常规的网站往往不肯如此影响用户体验,在用户体验至上的环境里,https也往往不被主流网站采纳,一个简单的方法是,在登陆后生成一个临时密码作为当前用户的权限识别标记,这个临时密码会在会话结束后过期,这样的优点是临时密码基本上不太担心被侦听(除非是实时捕获实时操作)而登陆过程只有一次,认证过程很多次,所以被侦听到的几率就会小很多。另外,前端js加密也是有用的,有些人从“技术”上会反驳,我知道你js加密手段,我很容易破解你,你加密有什么用?但是我希望大家有一个概念,很多情况下,正在玩侦听的家伙并不是针对你的网站的,也往往并不是很专业的,可能就是网吧里看了一个黑客教程,下载了一个sniffer就开始玩的小p孩,设置的这些门槛,并不是针对那些盯着你非搞你不可的家伙,而能过滤掉这些无聊的过路黑客,对你的用户来说,也是很有意义的事情。在成本较低,而你的网站知名度也不是很高的情况下,这些技术上看上去并不特别靠谱的事情还是可以大幅度提高你的安全性。记住一点,很多黑客并没有明确的针对性,喜欢网上撒网,然后看到有意思的东西再去搞,你不能让他看到一眼就觉得你的东西很好搞。
爆库的事情是本文的重点,按照 tombkeeper 教主所说,国内有点影响力的网站,2/3都被爆过库,不要认为自己的网站安全万无一失,防爆库是安全架构里非常重要的一点。防爆库不仅仅是防止别人拿到你的库,还要做最坏的打算,别人拿到会怎样;密码明文存储的,100%是死路,可逆加密的,只要黑客用点心,也是死路。不可逆的,很多工程师会以为可以高枕无忧了,但是这就是碰撞库的范畴;类似于cmd5.com这样的碰撞库,其规模远远超出了早期的字典档,所以常规诸如md5或者mysql password加密的密码,在碰撞库里被破解的几率,大于95%。至少,我常用的密码,我断定都在碰撞库里,原因很简单,不在碰撞库里的密码,我是断然记不住的。 那么如何规避这样的行为呢?加大加密强度?比如2次 md5? 3次md5? 固定salt 2次md5 ? 貌似不在碰撞库里了,是不是安全了呢?不是!只要你的加密算法是固定的,而且是黑客所能掌握的(比如固定salt被黑客知道),那么黑客跑一个常规密码档是非常快的,在这种情况下,你的用户库账号越多,黑客投入产出比越有价值,虽然没有cmd5这么庞大的碰撞库,但是用一天跑一个几千万乃至过亿常用密码的碰撞库,专门来对付你的数据库,也是很值得的事情,这种破解率,会很容易达到60%,有些朋友在微博反馈里说70%,大概也是这种类型。低成本的安全策略,就是随机salt二次加密,为什么discuz会用这种方法,是有原因的,因为这种开源软件你无法封闭你的加密途径,你必须让系统在开源的情况下,密码不会被破解(或者说门槛太高,投入产出不合理),有人说随机salt黑客会看到,并不安全;这个观点的问题误区在于,仍然只是将黑客当做针对特定账号的行为,而没考虑到黑客的真实生存环境,随机salt(每个密码独立的salt)的意义,对于只破解单独账号,与固定salt并无区别,但是对于破解一个庞大的用户数据库而言,固定salt黑客只需要跑一个碰撞库,而随机salt需要对每个密码跑一个碰撞库,这个计算成本。。。遇到这样的情况,你较真说,黑客一个个salt跑,一样可以跑出60%的密码,但是,绝大部分黑客,遇到这样的情况,会放弃,因为,不值得这样的投入。