2011年12月26日星期一

白帽公告网站的构想

= 白帽公告网站的构想

随着网络安全问题的进一步曝光,我认为应该引发一次[谢东危机](http://en.wikipedia.org/wiki/Seldon_Crisis)改善国内网站的技术以及习惯甚至盈利方式和商业道德。引发谢东危机的关键...

对于网络安全,有些服务商是主动犯傻,他们根本就不知道应该如何防御;有些服务商是被动犯傻,他们可能不得不采取某些明显不安全的手段以应对另一种压力。对于被动犯傻的服务商,我表示同情,在中国大陆这片土地上,生活已经是hard模式,何况还要养活那么多员工。但是同情并不意味着赞成和姑息。

中国大陆的网络服务商首先是商人,其次才是说中文的商人,再其次才是在中国大陆说中文的商人。商人就应该首先受到商业规律的控制,要规范商人的行为,使之不作恶,或者不协助作恶,还是要使用商业的武器和力量。

白帽公告网站就是一个这样的商业力量,这个网站将要定期或者不定期的公示各个网站与网络安全相关的行为,并且以简单明确的方式来表达,

* 这是给每个用户的一份知情报告书,你在选择使用网站的时候,应该知道有哪些安全风险。在同等服务质量的前提下,显然会促使用户去前往更安全的网站。
* 这也是给每个投资商的一份风险评估报告,当你要投资某一个互联网企业的时候,你要清楚是否有可能在某一天突然出现一次来自网络安全的重击,使自己的投资灰飞烟灭。
* 这还是给上市公司的第三方评估。一个无法保护用户密码和隐私的网站,是否能够真正保护投资人的利益呢。

白帽公告网站会选择一些与网络安全相关的外部行为进行评估,先找出一些指标,指明:

* 安全的充分条件:一旦出现,必然网站使安全的。这个看起来并不存在。
* 安全的必要条件:必要条件是说网站需要具有这些条件,否则就是不安全的。必要条件会有很多:密码应该单向hash,登陆过程中要保证密码不会被破译等等
* 不安全的充分条件:其实条目与安全的必要条件是一样的,本来就是逆否命题。换种表达方式可能测量和理解起来更方便,比如明文存储密码,明文发送密码。
* 不安全的必要条件:这个跟安全的充分条件一样是逆否命题。好像也是不存在的。
* 提示可能安全的条件:充分/必要这样的要求太严格了,项目不多,提示的作用也有限,毕竟绝对的牛逼和绝对的傻逼还是少数。但是一定的提示作用还是有的,而且列出这些条件,可以使互联网企业有个明确的努力方向和目标。比如:https,单向运算加密密码和用户信息等等
* 提示可能不安全的条件:同上,列出这些条件也是为了督促企业,避免去做这些容易导致危险的操作。

设想中的白帽公告网站,应该包含:

* 常见网站的列表,宁肯做成像hao123那样的页面。这个公告网站的读者都不是做技术的。
* 同类网站的比较,就是要形成竞争的压力,让普通人能够货比三家。
* 面向投资人的安全风险报告,可以有免费的,也可以有收费的。这种收费报告,可能是盈利的主要来源。
* 安全认证的徽章,要进行安全认证可能要深入到网络企业的内部,不一定能够取得这样的权限吧

Posted via email from goldengrape's posterous

2011年12月21日星期三

开源密码管理生成器

生活中随处要用到密码:ATM机上取钱,微博登陆,邮箱登陆……在这个信息时代,其实真正能代表你的恐怕只有你的密码了。

安全性最低的方法,就是用统一的一个密码来登陆所有这些,算是一了百了,只要记住一个密码就足够了,但是只要有一个密码被人破解,你所有的身份、金钱也就可能随之给了别人。我们需要不同的密码用在不同的地方,甚至某些网站要求定期修改密码于是我们就要记住越来越多的密码

对于年纪大些的人,可能会用一个密码记录簿来记录这些密码威胁也是存在的,如果密码记录簿丢失了,那么所有的密码也就丢失了,或者需要用某个密码的时候,恰好记录簿没有带在身边,也就无法回忆起那个密码

比物理的密码记录簿更优秀的方法,是设计一个主密码然后利用某些规则生成许多子密码应用在不同的网站上,比如主密码是“一枝红杏出墙来”,那么在微博上子密码可能就是“一枝红杏出微博”,新浪上子密码可能是“一枝红杏出网易”,Gtalk上子密码则变成了“一枝红杏出QQ”之类的。这种方法也有几个问题:
1. 如果从主密码到子密码的规则太简单,那么一个子密码被破解,有可能逆向推出主密码,然后所有密码也随之被破解。
2. 如果从主密码到子密码的规则太复杂,则又出现了新的记忆难度
3. 对于银行卡和ATM机之类只支持数字密码的,需要另一组生成规则

比生成子密码更好的方式,是密码管理软件或者网站。用一个主密码进入密码管理软件,所有的子密码是由软件随机生成的,其中任何一个子密码被破解,也不影响其他子密码,也不会被逆向破解出主密码密码管理软件的弊端和纸质的密码簿由相似之处,就是一旦接触不到软件或网站,自己也很难想起密码来。

理想的密码管理方式是:
1. 开源的。密码管理软件如果是闭源的,风险就很大。谁知道会不会有哪个无良程序员在软件中设置后门,将你所有的密码都记录并且传递到某个地方去。
2. 跨平台。你可能有一台PC,一台Macbook笔记本,一只Android手机,还有一个kindle电子书。这些设备都需要能够产生/调用你的子密码
3. 在线/离线方式共存。在线的网站通常是等价于跨平台,比如lastpass就是一个不错的在线记录密码的网站,虽然它并不满足开源的要求。但是网站总有一个是否能够接触到的问题,比如你站在一台位于地下商业街的ATM机面前,连个手机信号都没有,任凭lastpass如何在云端,你也无法接触到了。
4. 子密码不可逆向推出主密码。子密码之间无法互相推知。这一点成熟的密码管理软件都可以做到。
5. 同时可以管理字符和数字型的密码

综上,我想出了一种密码管理生成的方式,如下。

密码=MD5(主密码+应用名+版本号)
例如,主密码是“12345”,应用在微博上,第0号版本。密码=MD5(12345+weibo+0),那么使用16进制的MD5数值作为字符型的密码而使用整数型的,作为数值型密码:
 integer form | 125005476443167096316531531755775625670
 hexadecimal form | 5e0b 2dd4 df66 07a9 af36 7b41 6c48 89c6
不过实际中用不了这么长的密码,可以只使用前8位"5e0b2dd4"作为密码
密码是应该定期更换的,比如3个月更换一次。于是下一次更换时,用MD5(12345+weibo+1),密码变成了:
 integer form | 48819798530286427763212232259863620227
 hexadecimal form | 24ba 59e7 6185 ba3e d70b 865f 94f8 aa83
如果是用在银行卡上,比如工商银行,那么生成的是MD5(12345+icbc+0),密码是:
 integer form | 140350455243536382853078667013757626879
 hexadecimal form | 6996 83b2 bedc b85b 4d38 a837 7584 69ff
考虑到ATM机只认6位数字,密码是140350

MD5,Message-Digest Algorithm 5(信息-摘要算法 5),是广泛使用的散列算法之一,能够将数据运算为另一固定长度值。

MD5对输入序列非常敏感,有一点点的差异,就可以产生出完全不同的MD5值,比如上述的MD5(12345+weibo+0)、MD5(12345+weibo+1)、MD5(12345+icbc+0),所产生的数值就完全不同。所以你的子密码看起来根本没有什么相关性,从MD5值逆向推导出MD5函数的输入值是非常困难的。这个难度和破解现在银行使用的计算机系统的难度相当。因此即使你不慎丢失了一枚子密码,其他的子密码仍然是安全的。

MD5的算法是公开的,有很多软件可以计算。你可以下载一个计算md5的工具来作为自己的密码管理生成器。因为MD5的用途实在太多,因此在windows/
Mac OS/ iOS/ Symbian/ Android/ WebOS下一定都会有大把的计算软件可供使用。
如果不相信别人的软件,你也可以自己来写,比如在Mac、linux上,可以直接在终端中输入
md5 -s "12345+weibo+0"
就可以得出5e0b 2dd4 df66 07a9 af36 7b41 6c48 89c6的答案。在python上也就是一行代码:
import md5; md5.md5("12345+weibo+0").hexdigest()

如果懒得动手,也有云端版的MD5计算器。到https://wolframalpha.com/ 上输入md5
12345+weibo+0,就可以计算出数值了,同时返回整数型和16进制型的。更厉害的,在手机上,用任意浏览器访问https://m.wolframalpha.com
也有同样的效果。不过注意,wolframalpha的搜索字符串是直接作为明文提交到网站上的,如果在网络路途中,有什么人监听的话,可能会丢失你的主密码哦,一旦主密码失窃,你所有的密码也就都丢了。所以最好还是通过本地运算比较好。

最后,介绍下我们(我,@chenxiaoqino @Hjin_me)制作的一个MD5密码生成器:http://code.google.com/p/md5-password-creator/
第一个输入框中填写您的主密码。
第二个输入框中填写您需要的应用名或者网站名称
点击MD5!以后就可以算出您的MD5密码了。如果只需要其中的一部分,就是『切出前』选择一个位数,点击>即可。
界面简陋,功能实用,希望您能喜欢。

Posted via email from goldengrape's posterous

2011年12月16日星期五

用普通语言讲解下密码安全

试着用普通语言注释一下@caoz的这篇关于安全的文章goo.gl/3krVV 有不对的请各位推友及时指出。这篇文章讲的不是一个普通用户应该怎样保护自己的密码,而是针对服务商讲解应该怎样保护用户的密码。但是作为一个普通用户,了解其中的知识很有帮助。

我们平时会登陆许多网站,比如开心、人人、微博之类。这些网站如何知道我是他们的用户,并且输入的用户名和密码正确呢?他们需要有一个记录簿来记录我的用户名和密码之间的关系。有些很差的服务商会直接记录我的用户名和密码的原文

以密码的原文记录我的密码是非常不负责任的行为。一旦泄露给公司内或者公司外的人,他们就可能对我不利。@caoz提供一个简单的方法来推测,如果找回密码时给出的是您密码的原文,那么这个网站是非常不靠谱的

服务商会把所有用户的用户名和密码保存在一个数据库中保护起来,但是放在网络上这个数据库就有可能被偷走,就是爆库。“国内有点影响力的网站,2/3都被爆过库”,所以看来被偷走是迟早的事情。如果密码是以原文形式保存在数据库中就危险了

于是服务商一般不会以原文的形式保存用户名和密码。而是用所谓的HASH运算的方法将密码转换成另一串代码保存起来,这种运算方法是单向运算,就是从密码生成hash代码非常快捷,但是要从hash代码逆运算求解密码则非常困难。

hash运算goo.gl/xoYt有许多种方法其中比较有名的有MD5,sha等等。虽然hash是单向运算,但是如果记录了足够多的正向运算的因果关系,并且把这些对应关系存储起来,就是碰撞库

比如密码是“a”,hash值是“丑牛”,虽然从“丑牛”推不出a来,但是如果有碰撞库恰好记录了丑牛=a,那么只要在数据库里查询一下就可以知道原始的密码了。这就是碰撞库的意义。@caoz举了个栗子cmd5.com 推荐看一下其中的破解范围

对于服务商而言碰撞库就非常可怕了,通过碰撞库,黑客可以获得整个用户数据库中相当多的人的密码。从cmd5.com中的破解范围所述,8位以下的密码都是不安全的。很多人会想,反正我在人人、开心上也没什么秘密,丢就丢了呗。

其实不然,作为人类,我们记不住那么多密码,想想你是否在多个网站用同样的用户名和密码呢?甚至有多少人的开心网密码和支付宝密码就是同一个呢?如果是,请面壁。黑客们还有一个叫做社会工程学库的工具,简称社工库,专门记录以前被爆库的数据

有经验的黑客会从社工库里面取出数据,去知名网站上测试。这个过程是用计算机高速进行的。你丢掉了一把钥匙,然后就出现了一个机器人在每个高档/知名小区的门锁上插着试,每秒钟成千上万个门的测试。如果你跟现金打交道的帐户也是相同密码怎么办?

goo.gl/3krVV此文的注释讲完。对于服务商我们其实无法控制,他们被爆库我们也帮不上忙,只是在我们的信息被窃取之后能够将损失和危险降到最低。我对于普通用户的建议:1.设定足够长度的密码。2.每个网站使用不同的密码。3.定期修改密码

我现在使用的密码管理方法是通过goo.gl/6mwE2以主密码配合网站名的方式对每一个网站生成不同的子密码,并且定期更换,这样即使一个密码丢失被破解,其他的服务仍然可以保持良好。

对了,如果对密码学更有兴趣的,推荐欧姆社的《漫画密码》,看着漫画就明白了。

Posted via email from goldengrape's posterous

2011年12月5日星期一

“米饭实验”该怎么做――给马昊同学的一封公开信

“米饭实验”该怎么做——给马昊同学的一封公开信

金色葡萄 发表于
2011-12-01 20:15:29

小学四年级的学生马昊所做的“米饭实验”,经媒体报道后引起了热议。这个“米饭实验”虽然缘于著名的伪科学图书《水知道答案》,但其本身并非不能操作。果壳网友金色葡萄就针对此事,与马昊同学进行一番探讨,据此我们可以了解,一个规范的科学实验,应该怎么做。

马昊同学:

你好。

在 《南方都市报》 上看到你的“三碗米饭”实验,感到很有趣。想不到在小学四年级的你已经开始做一个科学实验,当你听到一个观点时能够亲自动手进行验证,并且通过报纸将实验结果公布出来,这已经完成了一个科学研究的几个基本环节。

  • 首先是提出假设。我们在生活中会遇到许多问题,根据经验也会自己总结出一些规律,在科学研究中要把观察到的现象总结成一定的规律,然后提出一个可以被证明正确,或者可以被证明错误的假设。这一步你做得很好:将“人类行为对事物的影响”这么大的题目精简成了一个简单的假设:“人类带有情感的语言是否可以影响米饭的腐败过程?”这个假设是可以被实验证明或证伪的。
  • 第二步是设计实验。你的实验设计是对米饭进行赞美或者咒骂,来观察米饭的腐败过程与程度。这也是一个不错的设计。它的优点在于,实验简单易行,对一个四年级的小学生来说,你是有能力实施这个实验的。另一个优点是,这个实验的结果比较容易定性观测。从你的实验结果上来看,米饭在约一个月的实验之后出现了明显不同的三个结局:白色,变黄,又黑又臭。这三个现象清晰可见,避免了许多复杂的测量。
  • 第三步你实施了实验,并且认真做了观察。我不知道你是否有实验记录,对于科学实验,是需要有一个专用的记录本来记录实验现象的。
  • 第四步,你通过《南方都市报》公布了你的实验结果,使大家可以看到你的实验方法和实验结果,并接受同行的评议。很多报纸都引用了你的这次实验,由此看来,你已经基本完成了一个科学研究的基本流程。

但是,其中有一些环节你做得还不够好,下面我就谈一谈我的看法,供你参考,希望对你有所启发。

“米饭实验” 的实验条件控制

在科学研究中,我们要很小心地去控制可能影响结果的因素。比如,在投铅球比赛的时候,铅球的颜色并不会影响你的成绩,而铅球的重量、投铅球时的风向和风速是会影响你的成绩的。还有一个常常被忽视但作用却不可小瞧的影响因素:裁判和记录员。如果裁判很严厉,那么你可能为了避免犯规而离投球线更远。

为了要弄清楚可能影响结果的各个影响因素之间的相互联系,我们在研究的时候会尽可能地使各个影响因素都处于严格的控制之下。要检验其中某一个因素对结果的影响,就需要保持其他因素不变。如果某个影响因素实在难以控制,就需要以随机化的方式经过多次实验,使这个影响因素的作用变得不明显。

影响因素分析

对于米饭的腐败过程,通过查阅文献、结合常识和本次实验的假设,可能的影响因素包括:

①人类对米饭的态度,②米饭的数量,③米饭上细菌的种类,④米饭上细菌的数量,⑤米饭的生熟程度,⑥保存环境的温度,⑦保存环境的湿度,⑧稻米的品种,⑨存放米饭的容器;甚至米饭在容器里的堆放方式也有可能对结果产生影响。

各个影响因素的控制

其中一些是比较容易控制的,比如米饭的数量和米饭的生熟程度。你需要使用秤或者天平称量同样多的米,加入同样多的水,使用同样型号的电饭锅进行烹调;在其后发表的科研文献之中,电饭锅的型号也是要写入到论文之中的。保存环境也可以用电冰箱来控制。

另一些控制起来则相对困难,比如米饭上的细菌种类和数量,就是很难控制的影响因素,也可能是关键因素。从你发布的实验过程照片来看,你是直接对着米饭说话的——人在说话的时候会有大量的飞沫产生,飞沫之中会带有一定数量的细菌。这些细菌会直接喷洒在实验对象(米饭)的表面。这样就很难认定造成实验结果的原因到底是飞沫数量还是含有情感的语言了。

对于实验中细菌的控制其实是一门学问,称为“无菌术”(Aseptic technique)。以前外科医生做手术是不刷手、不戴手套和口罩的,手术过程中他们会把细菌也喷洒到病人的伤口上,引发伤口感染化脓。直到 1864 年,一位匈牙利的医生塞麦尔维斯(Semmelweis)提出做手术之前要用消毒液洗手,才开始逐步解决。

关于米饭上细菌种类的控制,可以采用如下办法。米饭蒸熟以后,要放进同样蒸煮过的容器中,并且密封好,使外界的细菌不会进入到米饭之内。但这样可能会使米饭长期保存也不变质或者变质非常缓慢。要加快变质过程,你可以在接种箱内接种同样的霉菌到米饭的表面上,然后用一定的材料(如保鲜膜)把米饭密封好。这中间的操作过程有很严格的要求,你需要生物老师的协助。

http://img1.guokr.com/gkimage/f1/dx/5i/f1dx5i.png

科学家使用接种箱进行接种实验(图片来源:siue.edu

对于实验要研究的因素——人类含有情感的语言,也需要有所控制。我们姑且认为在中国的米饭可以被中文语音所影响好了。在以后的实验中,我很期待看到其他语种的测试结果。你也许需要对米饭施加同样强度的赞美和咒骂,我个人建议,使用最简单的“你真好”和“你真坏”即可。

排除人为因素的干扰

在科学研究中,为了防止自己和其他人有意或无意影响实验结果,还应当使用“双盲”的方法。实验中,应该让观察者或者实验者不知道实验的分组细节。在你的这个米饭实验中,你不能同时担任实验者(对着米饭说话)和观察者(记录米饭的变化情况),因为作为实验者,你是知道自己所表达的情感的,而观察者不能知道哪一碗米饭受到了怎样的处置。要做到这一点,你需要得到哥哥和父母的帮助。

你在塑料瓶上画的“小花”、“猪头”和“空白”需要用胶布遮起来。然后请你的父母在塑料瓶的另一处分别标记上 A、B、C,表面也用胶布遮挡起来,对应顺序只有你父母知道,不能告诉你或者你哥哥。实验时,你打开自己的胶布,根据图画标记说赞美或者咒骂的话,之后再把胶布重新贴好。观察时,由哥哥打开他的胶布,记录下 A、B、C 三个瓶子里面米饭的腐败程度。遮挡胶布是为了形成 “双盲”,使实验者和观察者彼此分开,互不了解分组的细节。实验结束时才能取下胶布,查看结果。

实验的分组

在设计科学实验的时候,一般会有几组实验对象,分为实验组和对照组(对照组细分的话,还可以有阳性对照、阴性对照、空白对照等)。在实验中,你已经将实验对象——米饭,分成“赞美组”、“咒骂组”和“不理睬”三组。“赞美组”和“咒骂组”看起来是实验组,而“不理睬”组,我想你是想作为对照组。对于语言“情感”影响,我认为还应当加入一组是无情感语言组。你可以选择一些没有明显情感的语句对这一组施加影响,比如对着它数数。

重复实验验证结果

最后,你不仅需要自己做这个实验,还需要让其他同学按同样的方式来做这个实验。通过多次重复实验来消除一些不易控制的因素的影响,比如你的语音强弱。

综上所述,马昊同学,你已经具备了一定的科学研究的意愿和能力,但在很多实验设计的相关问题上还需要更多的学习和训练,希望你能保持这一份对事物的好奇心,增长自己的知识和技能。本文只是选择了一些科研中常见的问题与你讨论,在实际的研究中,你还会遇到许多的问题,比如如何分析数据、评分标准的设定等等。你应当查阅前人的文献,向相关领域的专家进行咨询。

致礼

=====

本文发布于果壳网:http://www.guokr.com/article/76404/ 

文字由果壳网的美女编辑帮助修改,使我本来生硬的语言变得如此温柔。文中的双盲实验方法与果壳网诸位编辑讨论后产生。要设计出个双盲还真不是件容易的事情。

本文版权属于果壳网(guokr.com),转载请注明出处。商业使用请联系果壳网


Posted via email from goldengrape's posterous