Friday, 15 November 2013

设计自己的密码规则,实现强壮的自我保护

 现在已经不常上博客来了,因为移动互联网的到来,资讯的获取大多数时候是在微博、微信、Pad 客户端上。无意中看到月光博文的这篇《电信级的RSA加密后的密码的破解方法》,个人的感觉是“匪夷所思”,一个堂堂的巨大公司居然会盗取用户的密码,这世界真是太不可思议了……算了,也不去论证这种事情存在的原因,以及它对如此巨量用户的伤害,作为一个普通的用户个体,在无法寄望于正常的保护后,我们还是来想办法怎么自己保护自己吧。

  我们在网站上注册用户一般有两种原因,一种是临时性的,主要是为了下载或查看一些必须登录才有相应权限的资源资讯。在这种注册时,密码可以是很简单甚至固 定的,同时用户名有一个特定的标识前缀或后缀,以便很容易区分,所有该类用户都可以用同一个密码。同时,这类用户名绝不发布包含个人重要信息或观点或有意 义内容的帖子(以避免你一个很久以前不经意的帖子被判“违法”——央视社会与法频道前几天报道一个新郎,两年前为浏览一个成人页面而发了一些成人图片被判 刑,婚礼泡汤。成人图片的意思大家懂的,我就不解释了)。当然,如果你担心有人登录你这样的账户并发表一些不合适的内容(似乎想陷害你),那你除了注意个 人的身份信息外,可能还需要简单改进一下密码规则(见下面的技术)。

 另一种注册用户的原因就是你真正想在上面呆,这样的地方你肯定会发表有意义的内容和表达个人观点(请遵守网站自身的相关规定),并且一般情况下你的个人真实身份也可能会正常泄漏,所以密码的安全性很重要。那么应该如何构造一个既安全,又容易记忆的密码呢?

 我是这样做的:

  在我的人生中,有一些重要的人、事件、时间、地点……它们都各自可以用一个字符串表示,如日期“2013.11.11”、地点的拼音串 “zhonguoshenzhen”、生日“1989.09.01”(是的,用生日没关系……),它们都在我的心中,不会忘记也无需记忆。毫无疑问,这些 字符串不能直接拿来做密码,因为网站很可能明文记录它们,这样你心中的这些标识就泄漏得一干二净了(很危险的事)。同时你还需要记住那个用户名对应心中的 哪个标识,如果你记性不好,可能把它记在纸上,而这也不安全!

 那该如何做呢?

 其实无需记住哪个用户名对应哪个密码,也不 用明明白白记在纸上。你需要做的是建立一个心中的映射:把心中的那些重要标识用一个易于联想的单词(甚至只是一个字母)对应起来,然后在纸上记录这个联想 词及其所属帐号。所用联想词一般组合使用更好,如 A 代表你喜欢的一位 AV 明星的名字,B 代表你第一位暗恋者的生日(Best),记在纸上的“BA”标识就代表那个生日加上另一个名字(~哈哈,莫要鄙视俺啊)。这样,密码被记在了纸上但依然安 全。在你未来的一生中,你会注册的网站会很多很多,远远超出你的想象~,so……隐私很重要!

 记在纸上的密码安全了,但网站那一端呢?如果登录的网站被第三方不可抗拒的植入了 JS 键盘记录代码,或者网站本身就无法保护你留下的密码呢?我们该如何面对?

 答案是:

 在浏览器上装一个 Hash 插件(MD5、SHA 等皆可),在插件中输入从联想词翻译过来的密码,Hash 出一个字符串(当然也可以多次执行,如先 MD5,然后再 Base64)作为最终在网站端使用的密码。这样做的安全性如下:

 1. 在插件中输入密码,使得浏览器中目标网站的页面即便被注入了 JS 代码,但页面中的 JS 代码没有能力获得插件中的输入;

 2. 最终提交给网站的密码串经过了 Hash 计算,这是一个不可逆的类随机字符串,无论谁都无法知晓“你心中的那些永久标识”(PS:那些标识的数量是有限的,所以也是珍贵的);

 3. 当然,浏览器和操作系统干净是总前提,否则一切安全性免谈;

 总结一下:

 1. 临时账户用简单密码甚至固定,账户名具有一定特征,不发表有意义内容。如果担心身份被盗用,密码可以加一个 Hash 保护;

 2. 建立一个“心中重要事物的标识”清单,用易于联想的字词对应。联想词作为准密码记录在纸上;

 3. 在安全的浏览器上(如 chrome)安装一个 Hash 类插件;

 4. 真正注册时使用的密码是由联想词翻译出来的标识串 + Hash 计算后的类随机字符串;

 安全性与适用性:

 1. 不论网站页面是否被强制注入 JS 盗取密码(附带说一句,这样的盗取代码很简单),也不论是否网站本身安全性就有问题,这样做都可以保护你。

 2. 因为最终用到网站上的密码是使用 Hash 计算而来,不存在破解可能,你心中的那些重要标识不会被知晓,那么它们就可以永远使用。如果需要修改密码,调整一下联想词组合即可;

 3. 联想词记录在纸上,无记忆负担。同时无人知道那些联想词对应什么(建议组合使用),那样即便很熟悉你的人也不可能完全清楚它们是什么;

 4. 建立一个自己人生中“重要事物的标识清单”并用简单词联想并不难,——它还会逐步丰富,动态扩展。

 5. 总的来看,你需要记住的只是一样东西——一些自己很难忘记的东西(构造标识可以简单使用拼音,或者其它,你自己清楚即可);

 更精简一点的表述:

 1. 心中:重要东西标识串 => 联想词。例如:A => 心中的 AV 明星(yjly);B => 初恋女友的生日(0828);C => 我最喜欢的编程语言界大哥(stm);

 2. 纸上:用户名,密码为联想词组合。记录:网站 HttpX;用户名 巴地草;密码 ABC;

 3. 网站:用户名,密码为 Hash(联想词翻译)。计算:base64(md5('yjly0828stm'));

 4. 最终在网站上使用的密码是:'ZmE2NjkzMDUxZWNlMzRhNzY5MWUxMTBlMDBhNGZhYWU';

 5. 这个规则太简单,你可以设计得复杂一些——当然只有你自己知道。

 在馄饨的互联网上,保护自己或许并没有想象中的那么难。无需信任任何一方,你可以设计你自己的密码规则!祝所有的网友平安、健康,还有快乐!

from 月光博客 http://www.williamlong.info/archives/3660.html