主页 |
19
2011年11月
nleven
评论
 
 
 

近日又看到一个坑爹的验证码实现:直接把验证码的答案存进cookie。

恐怕提交到服务器上之后就是验证了下cookie("code")==code之类的。但是cookie可是存储在客户机上的啊。。。直接把答案告诉人家还怎么指望用验证码难住程序?

比较简单靠谱的方法,就是把cookie换成session。web框架基本都支持session,而session中的数据则是存在服务器上的,客户机获取不到。

但有时候为了性能考虑,可能会避免用session。这种情况下,也有一种很便利的方法。



先介绍下HMAC,Hash-based Message Authentication Code。

HMAC(K,m) = H((K ⊕ opad) ∥ H((K ⊕ ipad) ∥ m)).
其中,H是一个哈希函数(建议用SHA256,但MD5也足够了),K是密钥,m是一段数据,ipad、opad是两个padding常数,详情参看wiki

简单来说,HMAC也是对一段数据m计算hash,但是只有当已知正确的密钥K时,才能计算出这个HMAC。

回到验证码的问题上来,产生一个验证码后,往cookie中写入timestamp和HMAC(verify_code||timestamp, key)。其中,timestamp是当前时间的时间戳,verify_code是正确的验证码,key是一个固定的密钥。

校验验证码时,只要先看看时间戳有没有过期,在拿用户提交的验证码重新计算HMAC,就可以知道验证码是否正确。由于只有服务器知道key,因此其他人是无法伪造这个HMAC的。

这样,服务端上不用存储验证码的校验数据,客户端上也无法通过cookie计算出验证码。

 
 
 
15
2011年6月
nleven
评论
 
 
 

GAppProxy不用多作介绍了吧,经常翻墙的或多或少都知道的。不过GAppProxy的作者似乎没有兴趣提升安全性,简单的加密也没有。虽然也有一些想要提升安全性的branch,不过还是没让我满意。

SecureGAppProxy其实原本是我自己用的一个branch,乘着最近有点空,就把它整理了一下发了出来。代码遵循GAppProxy的GPLv3发布。
因为需求原本是自用,所以功能是比较简单的。

详情看这里吧:
http://code.google.com/p/secure-gappproxy/
如果真的有人用的话,我再写点吧。

 
 
 
05
2011年6月
nleven
评论
 
 
 

在讨论国家机密定义太模糊时,经常会有哥们冒出来,认为模糊的定义对国家安全是有好处的。似乎,国家机密越多,国家就越安全。

无意间翻到Bruce Schneier博客的一篇旧文,原文是批评美国国土安全部扩大保密范围的做法,不过论证过程其实可以推广到国家机密和国家安全的范畴上,题目就是The Non-security of Secrecy。里面其实就问了三个问题,保密真的有用吗?公开是不是更好?保密符合谁的利益?

下面就是翻译,有兴趣的读原文去吧。


保密,却不安全

Bruce Schneier
ACM通讯,2004年10月

在保密和安全这两个不同的概念之间有很多混淆,其结果是糟糕的安全性和令人吃惊的政治争论。保密通常只是给人一个虚假的安全感。

2004年6月,美国国土安全部要求监管机构对网络中断的信息保密。美国联邦通信委员会要求电话公司报告大规模的电话中断现象,并希望将此政策扩展到高速数据线路和无线网络。美国国土安全部担心,这些资料会被网络恐怖分子当作“虚拟世界的地图”,打击关键基础设施。

那么,发布计算机和网络的安全弱点有没有好处?还是说,这只不过是在给黑客帮忙?自从恶意软件能迅速利用最新公布的漏洞以来,这个问题就变得很常见。

认为保密对安全性有好处的观点,很天真,永远值得反驳。保密只在有限的情况下有利于安全,而这里的“有限情况”肯定不包括安全漏洞和安全评估方面的信息。秘密是脆弱的,一旦泄密了,就永远地泄露了。依赖保密的安全性也一样脆弱,一旦泄密,就再也没办法恢复了。想把安全建立在保密上纯粹是糟糕的设计。

密码学是基于秘密——秘密的密钥,但看看密码学家做了多少工作让密钥更加有效率。密钥很短,而且易于传输。它们容易更新更换。而且,密钥是密码系统中唯一需要保密的。但如果想把密码算法也保密,那就太蠢了。这也是为什么密码学的基本原则之一就是假设算法是公开的。

支持保密的论点中有一个谬误,就是假定保密真的有用。难道我们真的认为坏蛋没办法发现网络的物理弱点吗?

支持保密的人忽视了公开对安全的价值:公众的监督是提高安全性唯一可靠的方法。在从前安全漏洞还不是经常公布的时候,软件公司否认漏洞的存在,也不会去打补丁。因为他们相信,只要漏洞是保密的,那就是安全的。而且因为客户没办法全面了解这些信息,他们买了这些系统,仍然相信它们是安全的。如果我们保密软件漏洞,那么在安全社区中不会有多少人知道,但却有很多黑客知道。

保密让人没法评估自己的风险。公开网络中断事故,能迫使电话公司改善他们的服务。消费者可以比较不同公司的可靠性,并挑选最能满足他们需求的。如果不公开披露,这些公司就可以隐藏自己的弱点。

谁支持保密?软件厂商(比如微软)想要保密漏洞信息。国土安全部的建议受到电话公司的热烈回应。保密符合这些公司的利益,而不是消费者,公民或社会。

911之后,我们不断地看到保密和公开的冲突。美国政府正试图保密许多反恐对策的细节,甚至政府日常运作。比如,工厂和政府建筑的基础设施信息,用于标识特定航空乘客的分析数据,国土安全部设立的恐怖主义威胁颜色分级标准,甚至是和恐怖主义毫无联系的政府工作信息。

这样可以把恐怖分子蒙在鼓里,尤其是没办法自己找出这些弱点的“笨蛋”恐怖分子。但与此同时,政府最终负责的对象——公民,也无法评价安全对策,评论其有效性。没有公开辩论或公众教育,安全是不能提高的。

最近的研究表明,大多数水、电、煤气、电话、数据、运输和分配系统都是无标度网络:他们总是有高度相连的枢纽节点。攻击者自然也知道这件事情,直接想办法攻击枢纽节点。安全人员从而开始学习如何加固枢纽节点,提高冗余。想要隐藏网络中的枢纽只会是徒劳无功的。我们不如主动标出枢纽,并更好地保护他们。

如果我们有足够的信息来向厂商施压,让他们提高安全性,那我们大家都会更加安全。但如果软件厂商都不公开软件漏洞,电话公司不公开网络终端,恐怕我们其实都不太安全。政府当然不想解释自己的行动,因为这让他们自己更安全,但这不是人民的安全利益。

 
 
 
18
2011年5月
nleven
评论
 
 
 

似乎最近bitcoin讨论得很火啊。正好Applied Cryptography里面也有介绍电子货币,我也来扯扯这个分布式的电子货币到底和别的有什么不一样。

电子货币

电子货币这个概念至少已经有20年的历史了。相比其他支付系统,电子货币中关键的是必须不可重复使用。毕竟,数据天生就是用来复制的,不能让大家都变成印钞厂啊。

之前的许多电子货币系统都需要一个权威机构,比如银行。这个权威机构将记录某个货币的使用情况,从而能够发现货币重复使用的情况。

不过,bitcoin没有设立一致认可的权威机构。虽然它可以广播所有的货币交易记录,但因为没有权威机构,无法区分伪造的信息。

如何解决这个问题的呢?简单地说,bitcoin用的是投票的方式。

所有的CPU都是平等的

bitcoin投票的方式并不是以IP为单位投票。因为它认为,这样一些能分发IP的机构就会有额外的优势。
它喊出了所有的CPU都是平等的口号,用运算力来投票吧\( ̄︶ ̄)/

具体方法挺简单的:

  • 交易产生后,会向全网广播该货币新的交易记录。
  • 如果一个bitcoin客户端经过验证后,认为某个交易记录是正常的,可以对它投票。方法嘛,就是计算一个proof-of-work,然后广播。不过,要产生这个会消耗不小的计算量。
  • 其他的客户端收到这个proof-of-work后,可以继续在此基础上投票,形成一条链。
  • 那么,其他客户端如果收到了两份不一致的交易记录,它只信任那些链最长的,也就是大多数人同意的。
  • 对于攻击者而言,如果这条链足够长,攻击者要想伪造交易记录,必须追赶上这条链,也就意味着很大的计算消耗。通过控制参数,可以调整伪造的难度。

不过这是个很粗糙的描述啦,细节可看这里

虽然我觉得这想法挺好玩的,不过心里依然不太踏实。其安全性依赖不少推测(如,网络中大多数人是诚实的)。其内置的通缩政策也很奇怪。让时间去证明吧。

前浪死在沙滩上

电子货币已经有好多先烈了,最终在支付的战争中输给了信用卡。大众习惯了信用卡,而且也不觉得电子货币的匿名性多重要。特别是,人们总觉得电子货币不太安全。

比如较早的一个先烈DigiCash,成立于1990年,最终于1998年破产。找到了一篇不错的博文讲这个:How DigiCash Blew Everything。一句话概括:The rise and fall of DigiCash: a story of paranoia, idealism, amateurism and greed.

希望高举开源自由的bitcoin能活得好点。

 
 
 
17
2011年5月
nleven
评论
 
 
 

摩尔定律说18个月计算机性能翻倍。随着硬件性能高歌猛进,暴力破解能够破解更长的密钥。那么,到底要多长才够?会不会有一天要不得不记住一串超长的密码,然后还得一天改一次。

这两天在翻Bruce Schneier的Applied Cryptography,有一个有趣的结论:就算用上超新星爆炸的能量,也不够破解256位的密钥。热力学第二定律给暴力破解设下了基本的界限。

为了改变计算系统的一个bit,根据热力学第二定律这个熵减必须依靠外来的能源输入。这个能量和kT有关,即玻尔兹曼常量乘以当前的温度。假定这个理想的计算机工作在宇宙背景辐射3.2K下,否则必须要额外使用热源。这样就能计算出更改1bit至少需要的能量,约为3.05*10-16 尔格。

考虑到太阳一年对外做功1.21*1041 尔格,这样大约可以改变3.97*1056个bit。也就是大约2188。但是这也只是数数而已,刚刚穷举了密钥空间,完全没有额外验证密钥是否正确。

当然太阳的功率并不算凶残,但是即便用上超新星爆炸的能量,大约1051尔格,也不过能够数到2220

所以,除非哪天热力学第二定律被打破了,256位的密钥基本是不可能被暴力破解的。如果考虑相同程度的密码,混合用大小写字母和数字,大约为43位。

当然,现实情况下密码还有可能被木马等偷走,使用的加密算法也会遭受其他密码学分析,实际情况要复杂得多。

 
 
 
13
2011年4月
nleven
评论
 
 
 
标签: experiment gfw

今天居然有人告诉我youtube.com不能上是因为youtube屏蔽了不能上,google很多关键字不能搜是google宕机了。。。
我整个人都orz了。。。。。

于是我就想了这么一个小实验,验证gfw的客观存在,以及它更可能处于国内并由政府设置。

GFW小实验

  1. 找一个被封锁的网站,比如www.youtube.com,复制下这地址。下面这个实验将演示,我可以让你上不去任何一个国外网站。
  2. 随意指定一个国外网站。如各国政府网站。这里用加拿大政府网站
  3. 访问http://canada.gc.ca,看到正常页面。
  4. 访问该网站下任意一个不存在的页面,如http://canada.gc.ca/anythingwrong,看到页面不存在的出错。
  5. 访问http://canada.gc.ca/www.youtube.co,注意少最后一个m,结果同上一步。
  6. 访问http://canada.gc.ca/www.youtube.com,补上这个m。
    注意,仅仅加上一个m,结果却和上一步不同,不再是个漂亮的出错页面了,而是直接无法访问。
  7. 立即访问http://canada.gc.ca,仍然无法访问,结果同上一步。
  8. 过几分钟,再访问http://canada.gc.ca,再次看到正常页面。
  9. 继续实验,可以在google中搜索任意不和谐关键字(比如:刘),搜索后撞墙,复制下地址栏URL内容。用该内容替换www.youtube.com重复上述实验。

可能的解释

对于这个实验,尤其是第5步到第6步的结果差异,存在如下解释:
  1. 该网站恰好宕机
  2. 厄,如果是这样,欢迎多次重复实验。你可以随意令任意国外网站宕机哟~
  3. 存在一套屏蔽系统,且www.youtube.com是其中一个关键字
  4. 第五步的关键字少了个m而免于过滤,第6步中出现了完整的youtube域名,通信被阻断。
    1. 国外线路上过滤了www.youtube.com关键字
    2. 欢迎尝试其他国家政府网站,任意国外网站。莫非各国都在屏蔽从中国发出的www.youtube.com连接?
    3. 国内线路上过滤了www.youtube.com关键字
    4. 至少在我看来,这是最合理的解释。 这套设于国内的屏蔽系统被网民称为GFW。本实验展示的是该系统有过滤TCP流量的能力,一旦发现包含特定关键字的流量,如www.youtube.com,立刻重置此连接,并持续阻断连接一段时间。
      另外,这套系统基本只能由政府设立,因为必须要求不同ISP配合,而有这个能力的只有政府。
总而言之,存在一套阻断国内到国外网络通信的系统,而且该系统很有可能在国内且由政府设立。

 
 
 
12
2011年1月
nleven
评论
 
 
 

干嘛发这个~

因为要做一个课程作业,然后网上搜了一下关于启动项的资料。
原以为网上会有很详细的分析,不过非常失望,只有一堆诸如“最全启动项列表”之类的东西,完全没有解释这个启动项为什么存在,对于恶意程序有何利用价值。
于是我捣鼓了一个礼拜,整理了一篇文档,尽可能地完善地分析那些启动项为何存在。

文档和工具

具体来说分析了Autoruns工具里的几大类启动项,涵盖了大多数:

  • Logon
  • Internet Explorer
  • Services 和 Drivers
  • Scheduled Tasks
  • Boot Execute
  • Image Hijacks
  • KnownDlls
  • Winsock Providers
  • Winlogon

然后有个YAAU(Yet-Another-Autorun-Utility)的Python工具用来列出这些启动项,就像名字说得那样,这个工具没啥特点,纯粹是Yet Another而已。。。
这个工具的作用可能最多是个Python教程:

  • 演示下_winreg的各种用法(atl.core中的一坨)
  • 演示下win32com的用法:具体为列出计划任务(atl.core中ListScheduledTask)、解析Windows快捷方式的目标(utils.lnkparser)
  • 尽可能的函数式编程风格,main.py的简洁内容我挺得意的。
希望这个工具能帮到需要的人。

下载(小心撞墙)

启动项分析报告:Google Docs阅读
YAAU代码:Google Docs下载
报告文档遵循知识共享署名-相同方式共享 2.5 中国大陆许可协议许可,程序遵循Apache 2.0 License (Apache 许可 2.0 版)授权。

由于时间紧(报告5天+代码2天),肯定有不少错误,我已经尽可能引用到微软文档的出处了,有啥错别吝啬不告诉我啊~~

 
 
 
09
2011年1月
nleven
评论
 
 
 
标签: ps3 hack recommend

不要错过这个talk

对PS3的各种破解,包括获得PS3的私钥。演讲技巧也很赞。
非常好的talk,莫错过。
Youtube链接,自备翻墙:

悲剧sony

众所周知数字签名是用来保证数据可信未被篡改的。PS3的私钥签名算法搞出这么一个挫Bug,SONY也算倒了八辈子霉了,写这代码的人是否会饭碗不保呢。。。

简而言之,PS3的签名算法用的是ECDSA,ECDSA这个签名体制本身当然是没什么问题。不过,这个bug的关键就是ECDSA中有一个重要参数必须是随机数,然后sony很给力地用了常数(Orz...)。于是乎,只要拿两个签名来,私钥就泄露了。。。
私钥都出来了,当然一切都完了,让盗版啥的来得更猛烈一些吧。

不过,退一步说,这种bug也并不是不可思议,看看网上的众多AES CBC加密代码,直接把IV弄成常数的太多了。虽然只是小问题,绝对不至于是机毁人亡级别的,不过反映了个问题,很多密码学领域的东西一般的程序员很少接触。
咱的需求就是给段数据、给个密码,请加密一下,库函数直接人性化一些不好吗?省得咱重造轮子,还不小心造成方的。。。

 
 
 
20
2010年12月
nleven
评论
 
 
 
标签: css3 web life ie6

由于在迁移博客,所以了解了下div+css的设计。
不得不说div+css还是很优秀的,很有效地分离了网页的“内容”和“样式”,在加个jQuery什么的js框架,动态效果也是不在话下。比画表格的设计方法好得多。
不过,随之而来的就是IE的兼容性,特别是IE6。IE6在中国市场份额居高不下,真是好奇来着,都是些什么人在用IE6啊?!网吧么?
这个网站里,我用了很多透明png,IE6果断不支持透明;顺便用了点CSS3的圆角阴影什么的,IE6/7/8依旧不支持。我想在访客用IE6/7访问的时候捣鼓个不兼容提示,发现要让不兼容提示显示正常就挺不容易的,我好挫好挫啊,Orz……
对网页设计师肃然起敬,IE6把你们害惨了。。。
哆啦A梦的控诉
哆啦A梦的控诉

 
 
 
13
2010年12月
nleven
评论
 
 
 

悲剧的Live Space

微软近期已经宣布live space即将关闭,想想挺可惜的,原本你多牛X的一个产品,就这么关掉了。我原来的space是msnspax.spaces.live.com,livespace建议迁移到wordpress,不过这不算什么option,因为这样就没法在墙内访问了。

所以我只好自立根生了,迁移到www.nleven.com上来了。

Bloggart

目前这个博客系统是Bloggart,可参看 代码说明演示

这个系统运行在Google App Engine上,基于Python的Django框架,作者貌似也是GAE Team的人。现在的这个nleven.com是在godaddy上按$10/year注册的,然后绑定给了GAE,这里还要考虑下墙的问题,因为ghs.google.com被墙了,主要有两个解决服务,一个是用反向代理(如www.you8g.com提供的服务),另一个是使用尚未被墙的ip。前者由于流量过载服务不稳定,后者则未来被墙的风险较大,我还要权衡一下。。。

一开始看中这个系统是因为其简洁和可定制。这个主题完全是我定制的,太久没做网页了,实现得有点nasty,什么时候改得好一点。。。。
Bloggart的功能不多,其实就是实现了文章管理、标签管理两个功能,评论系统外包给了Disqus,搜索用的Google CSE。它的优点是它大量用了memcache和静态生成,效率很好。

迁移的问题

从msn space迁移到bloggart很麻烦,因为没有官方迁移工具。有人给Bloggart做了个从wordpress迁移的工具(migrate.py),又有人做了个从live space移植到wordpress的工具(live-space-mover.py),然后经历了各种各样的问题,我才移植了过来。目前似乎很多live space的评论丢失了,有的用户名搞错了,各种的问题,暂时不想管。。。

Bloggart对中文的支持有点问题,特别是标签里有中文的话,我稍微改了下,其实不难,有空了再具体说说。

Bloggart的feature set还是太小了,目前就在右侧加了一个“我在读”,其实是我的Google Reader Shared Items。还有很多其他的想法,有空了再做吧,比如:

  • 支持Messenger Connect
  • 标签云
  • 更靠谱的主题
  • 等等

好了,不多说了,有心情有空了再发博谈谈吧。

 
 
 
 
 
 
我是谁
  • nleven
  • 理工男
  • 上海
 
 
我正在读
 
 
最新评论
 
 
标签
 
如未另行说明,则本博客中的代码采用Apache 2.0 License (Apache 许可 2.0 版)授予许可,其他内容采用知识共享署名-相同方式共享 2.5 中国大陆许可协议授予许可。
本博客由Google App Engine支持,基于Bloggart博客系统,评论系统由Disqus提供,博客主题由nleven设计。