许智翔:密码为什么不能明文存放

文章正文
发布时间:2024-07-17 10:53

理论上,密码应当一次一密。说的通俗点,就是保密级别不同的时候,密码应当不一样。这样虽然麻烦,至少某些密码泄露时不至于波及太广。结果这次CSDN不幸中枪。暂时不用去讨论多少人急急忙忙修改密码,多少人数据泄露,单说说为什么很多时候密码是明文存放的。

作为一个无证程序员,就我有记忆以来,我写应用就从来没有明文存放过密码。最起先是md5方式存放。md5是一个很老的算法,对一些资料,用一种不可逆的算法算出一个值来,叫做hash值。资料相同,值就相同。同样密码,得到同样hash值,不影响登录。由于无法逆转,因此算不出原始密码是什么,相对安全一些。然而一旦拿到hash值,有的时候会被彩虹表攻击。所谓彩虹表,简单点说,就是把常见密码的hash值全记录下来,见到hash去查表。这次泄漏之后,不能再用密码库中已经有的密码就是基于这个原因。但是无论如何,md5密码本身肯定比明文安全很多。

后来,中国山东大学出了一篇md5碰撞冲突的论文,md5就不安全了,后面用的多数都是sha256了。从头到脚,我就没做过密码明文存放,并且,我认为这是正常程序员最起码的修养。当然,明文存放的代码不是没有,不过那是调试模式。但是现在我所知,很多系统的身份验证都是密码明文存放的,为什么?其实我不大理解。不过有时候问起,有些人和我说了几个我觉得不是搪塞的理由,现在抄录如下。

1.管理需要明文密码的配合。

大家知道管理者往往需要对用户进行全面管理,有的时候,有些数据在他们无法进行管理的服务器上。怎么办呢?他们会问一些他们可以管理的项目去要密码,试试看密码是不是一样。在中国往往是“上面一句话,下面跑断腿”,事情下放,悲崔的程序员们就往往会得到一条死命令,保存明文密码。

2.压根不知道明文密码有什么问题。

中国的互联网有太多的没基础的新人,从石头的缝隙中顽强的生长出来。这不是坏事,坏事的是这些人往往会在一些基础问题上出现奇怪的毛病。例如有些程序员,写程序很快,但是居然从来不知道密码明文存放会导致什么问题。

3.自信暴棚的混帐。

在技术领域,有些人的自信总比别人强,而且强在莫名其妙的地方。例如:我的服务器肯定是没问题的,所以我的密码一定要明文存放。如果不,就是质疑我的技术。实话说,这种人真是少数中的少数,极品中的极品,程序员中的战斗机。

4.遗留系统。

很多系统设计的时候因为某个其他理由,使用了明文密码。等后来这个理由不存在了,密码系统升级成了一个困难。例如这次的CSDN,给出的原因就是因为原来和某系统配合,在原始设计上用了明文密码。因为密码系统太重要了,所以在没有太大利益的情况下,总是倾向于不修改系统。但是有什么足够利益来推动系统修改呢?对网站的运营者来说,用户安全问题在发现前不是一个问题——好比这次的CSDN,不是被暴出来的话就根本不会被当作一个问题。系统中的各方,无论是运营者,原来的程序员,现在的程序员,还是其他人,都没有足够的动力去推动修改密码系统。用户虽然有,但是多数根本不知道这个事情,也无力推动。

5.世界的阴暗角落。

在网络上,真实用户资料是有价值的——不但有价值,而且有价格。用户真实名字,手机号,家庭地址,都有人买。一些更加珍贵的资料没有人买的原因不是因为不值钱,而是因为太珍贵,所以没有人肯卖。

有的时候,程序员/老板明文存放的理由,是为了方便盗窃用户其他网站资料。例如我所知的某钓鱼案例,你注册网站,就提供很多免费服务,网站看起来也很靠谱——除了后来突然爆出这家网站其实暗地中用你的生日/密码猜解信用卡/银行卡密码,大家才突然发现,这家网站其实根本没有在美国注册,而是一个听都没听说过的国家。换到中国的某些小网站,就是为了试图用你的密码猜你的支付宝账户/银行密码。

很多网站提供从其他网站导入之类的功能,其实更加的危险。以前经常爆出twitter密码被窃取,主要就是因为OAuth开放以前,twitter上的第三方应用需要提供原生密码,导致很多小应用的目的其实就是收集密码…

6.为了给用户提供方便。

这个理由和上一个很类似,不过不是为了某些险恶的目的。而是客户经常要求——为什么我不能做XX事,为什么我不能blahblah。好吧,为了让你能,我们就必须保存明文密码。

明文密码的保存原因很多,不过结论都是一样的。在任何网站/服务上,你不能使用同一个密码,零级密码除外(就是你本来根本不想设定密码的地方)。最起码,把各个网站分个级,每个级别的网站用一个密码。尤其请注意,不要在两家银行使用同样的银行卡密码/网银密码,原因不说。

从未来的角度说,密码的未来进化趋势是核心授权体系。就是由一个网络身份验证商(可能是国家机构),为所有人提供身份服务。作为网站,不需要管理用户身份验证问题,只需要向身份验证商验证,剩下自动完成。现在的openid就是解决方案之一。密码都没了,还谈什么泄露呢?另外一个趋势是利用某个足够安全的设备作为终端载体。当网络身份验证商需要验证你的身份的时候,你需要一个自己记得的密码,和一个设备生成的密码。用过电子令牌的人大概感觉到心有戚戚吧。更好的方法是让设备成为你的操作界面。例如你访问网站,然后网站说“请验证身份”,同时画一个二维码给你。你掏出设备一照——“XX网站想要验证你的身份”。输入你自己的密码,或者将来可能直接刷指纹,确认这个请求。然后网站那里点确定,这事情就成了。

你听我的描述,是不是想到了什么?没错,目前来说,这个设备设想针对的是手机,可是——手机不是一个足够安全的设备。也许这会是下一个XX门的隐患吧。虽然计算机技术发展了这么多年,RMS的那句“安全就是个笑话”依然不过时。

(此为特别约稿专栏文章,请勿转载!)