显示标签为“技术”的博文。显示所有博文
显示标签为“技术”的博文。显示所有博文

2010年5月30日星期日

A for Authentication

每当看见 MSN 上失散多年的好友发来壮阳药广告或皮条俱乐部邀请信,我就轻轻将此信归入垃圾邮件,然后叹息又一个倒霉蛋中招了。中招源于轻信 —— 把自己的用户名和密码告诉了第三方,如非官方的网页版聊天器,或 SNS 网站上寻找 MSN 好友在本网站马甲的工具。密码本是用户和服务商两者之间你知我知的事,但用户找人代办某事时把密码给了这个不相干的第三者,后果是身份被人冒用。这还不是最糟的,冠希兄现在也该明白两人的事如果让第三人知道了,全世界就都知道了。

不同的人,与之共享的秘密也不一样:商业机密不该告诉家人;家里的糗事不该带到职场;兄弟的往事打死灌醉也不能透露给他现任婆娘。网络上也一样,别说银行帐号密码不能泄露给第三方(哪怕他自称公安局),公司网络的登录帐号、个人 MSN 和 GMAIL 邮箱也不能外泄。就连网络游戏也反复告诫脑残玩家 —— 问你账户密码的人绝不是本公司客服。随着各类网络服务不断增多,需要记住的账户越来越多,脑子越来越不够用。应该有解决之道,让我把线索理一理。以下是我的学习笔记,为了今后的自己还能看懂,尽量科普省略细节。


Authentication: 识别认证(向我证明你是谁)
Authorization: 授权许可(我知道你是谁,现在决定允许你干啥)
Accounting: 审计监察(检查你究竟干了啥)

前两者很容易混淆。两周前我回顾信任的传递体系,证书这东西其实是把前两个 A (认证+授权)串起来了。现实世界里,授权的传递(Delegate)很复杂,三个月前在讨论 UAC 时我就感觉头大,所以今天干脆放弃授权部分。只谈第一个 A,识别认证,这是用户参与度最大的一步。要完成身份验证,除了不太常用的指纹、智能卡、密保卡之类的外设,最常见的就是在键盘上敲用户名密码。


Single sign-on —— 公司里常用的认证技术,比如 Kerberos 协议的 Windows 集成认证。大致原理就是所有资源和服务都信任一个中央认证系统,用户只要向这个中央认证系统证明自己的身份,别的资源和服务就无条件相信用户的身份。至于用户在各资源或服务上的权限,可以中央控制也可以下放到地方。

在一个封闭的环境里,比如一家公司,设立一个权威的中央认证机构当然没问题。但同样的模式放到开放的社会里能行得通么?几乎所有网站都有自己的帐号 验证系统。不管做啥生意客户资料都是命脉,这信息托管出去就好像被人捏住了蛋蛋,人家时不时捏你一下,随时能让你完蛋。

另 一方面用户也不希望把自己的所有帐号都关联起来,这样做就等于实名制,既不自由也没了安全。网民的安全感是建立在隐私保密的基础上的,保护隐私靠的是商业 伦理而非政府行为。个人资料越分散就越安全。试想一个机构掌握了全社会所有人的所有资料,这机构除了上帝就一定是 KGBStasi, 太可怕了。英 国政府宣布百日内废除身份证,Google 近来关于隐私保护的官司缠身,很大程度也是因为民众的这种心理。




好吧,那把选择权留给用户,他们爱在哪里认证就在哪里认证,当他们需要用此处的身份去别处登录时,也可以,只要各服务商都遵守门户开放公约。这就好像拿着护照出国一样。OpenID 标准由此而来。早在它诞生以前,微软就抢注了 passport.net 域名用于用户身份的验证,这名字真太形象了。下面是一些遵守这个公约的网站:

Site URL Format Comments
Google https://www.google.com/accounts/o8/id Google does not require the username to be passed in the openID string.
Yahoo! openid.yahoo.com Yahoo! began allowing their usernames to be used as openIDs beginning January 31, 2008. Yahoo! does not require the username be passed in the openID string.
Microsoft accountservices.passport.net/ Windows Live ID
Facebook facebook.com/username/ Facebook
LiveJournal username.livejournal.com LiveJournal supports OpenID as both a provider and a relying party.
MySpace myspace.com/username
WordPress username.wordpress.com
Blogger username.blogger.com
Verisign username.pip.verisignlabs.com Verisign offers a secure OpenID service, with two-factor authentication, which they call "Personal Identity Provider"
Typepad blogname.typepad.com
MyOpenID username.myopenid.com
Google Profile google.com/profiles/username
Orange openid.orange.fr/username or just orange.fr/ Offers OpenIDs to their 40 million broadband subscribers, and accepts OpenID to allow non subscriber users to access a subset of services.
Launchpad launchpad.net/~username See https://help.launchpad.net/YourAccount/OpenID for details.

五年以来,情况似乎没啥变化。至少我登录 MSN 和 Google 都用它们各自的帐号。就像一个人有多重国籍,到哪个国家就使用当地护照,避免受歧视。毕竟本国公民的权限大一点,有些服务可能不对外来人开放。一个国家对非本国颁发的护照,信任度方面也会打折扣。还有 OpenID 容易受钓鱼攻击也是它不受待见的原因之一。总之,英特纳雄耐尔就一定要实现。哪一天?没准。实现了一切会更好么?难说。也许没人在乎。


听说 Microsoft, Google, Yahoo 和 MySpace 都开始支持一个叫 XAuth 的服务,就去学习了一下。试用完这个 Demo,看了看 Google 的说明Meebo 的科普,才明白它和我理解的 Authentication 根本不沾边。

这东西其实是方便网页的设计者从一个统一的地方(XAuth.org)获取当前用户浏览器同时登陆的其它社交网站的列表。近期因隐私保护官司缠身的 Google 还特意澄清:我们给 XAuth 的只是当前浏览器是否有帐号登录我们的服务,至于是哪个帐号(假设你有多个 Google 帐号)我们是不会告诉它的。也就是说,没有真正的传递 Authentication 信息。这纯粹是锦上添花脱裤子放屁:去访问某个网页,上面可能会有个 Google 的图标,如果你这时正好登录了 Google 这图标就亮着,如果你没有登录它就暗着或者隐藏 —— 注意这只是你自己状态,XAuth 无法提供你好友是否在线的信息因为它只认浏览器不认帐号。鸡肋呀鸡肋,想出这个功能的人很蛋疼吧。


让服务员帮忙泊车却不想他拿了车钥匙就跑了,让人帮忙修理电脑结果硬盘上的照片上网了,把邮箱密码告诉了别人结果该邮箱就开始以你的名义发壮阳药广告了。这些操作中 key 同时承担了身份验证和授权的责任。其实让人帮忙只要授权即可,本来是不必把用来识别身份的 key 交出去的。

年初时我学 Python ,在 GAE 上写了个 Twitter 的应用。用 Basic Authentication,即用户把密码发给我这个应用程序,然后这个应用再把密码转发给 Twitter 完成认证。我的程序自己用,犯不着自己偷自己密码,可别人写的应用就不好说了。六月底 Twitter 就不再支持这种认证方式了,我非常赞成。这年头信息安全越来越重要,账户信息外泄一方面用户身败名裂,另一方面服务商也很难追查 —— 用户自己干的还是第三方干的怎么说得清楚?

OAuth 解决问题的方法就是把认证和授权分开,认证仅由两方完成,牵扯第三方时使用临时令牌。这样做减小了身份被冒用和过度授权的风险。以 Twitter 为例,用户是甲方,Twitter 是乙方,第三方程序是丙方,大致过程如下:


1、第三方写好自己的程序以后,去 Twitter 处注册一下,得到 CONSUMER_KEY 和 CONSUMER_SECRET。(相当于证明自己身份的用户名密码)

2、当用户通过第三方访问 Twitter,第三方先去 Twitter 处用自己的 CONSUMER_KEY 和 CONSUMER_SECRET 登录后得到一个 Request Token。(这是一块临时令牌,可以共享给用户,拿到临时令牌的用户可以以此向 Twitter 证明自己是从那个第三方来的,但却不必知道第三方的密码。)

3、用户拿着这块临时令牌亲自访问 Twitter 输入用户名密码。这样 Twitter 不但确认了用户的身份,而且还知道他是哪个第三方应用介绍来的,它就问用户是否授权这个第三方应用访问他的账户。

4、用户授权后,Twitter 把这个用户返还给第三方应用,交还第一块令牌和一个 oauth_verifer 作为收条。

5、第三方将第一块令牌、收条加上自己的 CONSUMER_KEY 和 CONSUMER_SECRET 再次去 Twitter 认证,得到 Access Token,这是第二块临时令牌。

6、之后第三方应用使用这张 Access Token 临时令牌访问 Twitter 就可以代替用户首发消息了。

至此用户和第三方都在 Twitter 处证明了自己的身份,而彼此又不共享密码。以用户向第三方“授权”的方式取代了从前的“冒名顶替”,即便第三方干出了什么出格的事,Twitter 那边也有案可查。完美地实现了 AAA ,虽有些繁琐,但目前我也想不到更简化的流程。

一枝红杏出墙来

注意 OAuth 第 3 步,用户仍需亲自访问 Twitter 完成验证,对于天朝用户,我们和 Twitter 之间隔着伟大的墙。当初我写 GAE 的 Twitter 应用就是为了给手机凿一条穿墙通道。废除 Basic Authentication 以后如果我的程序严格走完 OAuth 流程,用户每登录一次就要翻墙一次。怎么解决这个问题?用 gtap 和 Malloc 的改版,十分钟搞定。原理就是在上述第 5 步以后,把 Access Token 保存在第三方程序的数据库中,并给用户一个 API 密码。以后每次用户用这个 API 密码调出这第二张令牌,第三方程序就用它访问 Twitter 不必重复 1~5 步了。

Twitter 客户端,手机上我用 ÜberTwitter,听名字像是德国造( Über = Super );Chrome 浏览器里用 Chrowety 巴西造。两者都支持自定义 API 地址,正好配合 Malloc 版本的 gtap 使用。BTW,世界杯快开始了,这俩传统强队都有主力缺席,但我还是支持他们。只可惜我叶公好龙,上届世界杯没一场球看全了的,本届估计也一样。折腾了这么半天 Twitter 其实我只是个潜水员,除非遇到找不着厕所或忘带草纸这类悲剧,Twitter 上我只收不发,就当它是第二个 Google Reader 。这东西好处就是实时,互联网比图书馆的优势就在这里:当年的 911 之夜我第一时间在 ICQ 上听陌生人说的,去年央视大楼着火和新疆维汉冲突我在饭否上看的文字加照片直播。说不定哪天敏感词寿终正寝了,极有可能我最先会在 Twitter 上看到,好赶在鞭炮和啤酒被人们抢购一空之前...

既然说到了翻墙,Chrome 上另一个好用的梯子是 Switchy,装了它以后我用 Firefox 的次数越来越少了。手机上 Opera Mini 要用可以改服务器的那个版本,走德国服务器,因为默认的服务器会驳回你的避难申请把你直接遣返回国,最终你还是落在敏感词的手里。万一哪天德国也和天朝签订难民遣返协议了,就用 GAE 或别的什么境外网站自己动手搭个 Opera Mini 代理,代码简单到几句话,原理就是三级跳。

好啦,就到这里,休息,休息一会儿。

2010年5月5日星期三

今夜无人入眠


北京时间今晚午夜,全球十三个根域名服务器的最后一台将完成 DNSSEC 部署。想要知道这是在干什么,先学习一下什么叫做“地址投毒”,这里还有这里。我来换个通俗的说法:

你的地址本(hosts file)容量有限,手工更新也麻烦,去不认识的地方你常需要问别人。你可以问本村的村长(DNS provided by ISP),村长有私心,他知道但不一定告诉你。比方说你要问他信访办的地址他肯定不能告诉你 —— 他干的亏心事太多,怕你检举他呀。于是你试着问村外的人(OpenDNS, Google DNS, etc.)。但你和别人所有的谈话村长都在一旁偷听,不光偷听,在还总抢在别人回答前冒充对方给你个错误的地址。

如何证明村长在偷听?用这篇文章给出的方法,我们来作个简单的实验。打开一个命令行窗口,把下面的命令执行多次:

nslookup -type=A www.youtube.com 129.42.17.103

“129.42.17.103” 是一个不存在的 DNS 服务器(可以把这个地址换成一个其它同样没有 DNS 服务的 IP 地址,效果是一样的)。在墙外执行这个语句不会有返回,而在墙里不但有返回,而且每次的结果还不一样。

“www.youtube.com” 是一个村长不想让你知道地址,不管你问谁这个地址在哪儿,哪怕去问一条狗,心虚的村长都会在对方答话前抢答。鉴于你问的是一条傻狗,正常结果应该是它根本不理你。而现在,你刚问完话,就听见狗叫,你再问同样的问题,狗又叫但叫声和上次不同。至此可以断定,叫声不是来自你问的那条狗,而是村长在学狗叫。而如果把以上命令里的敏感地址换成比如 “www.sina.com.cn” 这样村长认为安全的地址,这回村长就不叫了(当然傻狗也不会回答你)。


DNSSEC
的工作就是要给村长冒充别人说话制造一点困难。接下来根服务器以下的 DNS 服务器也会引入这一技术,用户要做的事就是找一台墙外的 DNS 服务器,设好 IPSEC 和 CA 认证。步骤比较麻烦,不同操作系统方法也不一样,相信不久就会有图文攻略出炉,跟着做就是。

村长那边的最新动向只许我学狗叫鸡叫,村民放个屁都要实名制。以便必要时可按“泄漏机密”或“危害安全”罪给放屁者以惩治。

村中屁民对此条令的反应大概是 ————


翻去年春夏之交的饭否记录,热词之一是“绿坝”,那个夏天没过完,饭否就没了。道消魔长,情况一天比一天糟,但我们总算守住了一城,不是么?

2010年3月5日星期五

UAC



为求一个 StartCraft2 测试的帐号,我把珍藏多年的原版 StarCraft CD-Key 翻出来,去美服战网注册了一下。眼看正式版开服在即,我的申请多半没戏,抽空玩玩前作也算热身。在 Win7 下安装完游戏登录战网更新补丁时出了点问题,总提示无法识别游戏版本。Google 了一下这个问题的解答,都没说到点子上。正确的做法是:

启动游戏时用右键,选择 Run as administrator 或者干脆把 UAC (User Access Control) 关掉


上礼拜一相识二十多年的老哥半夜来我敲我家门让我帮忙修电脑,因为一个炒股软件在他的新笔记本上运行不了。半分钟搞定,方法同上。

从 Vista 开始引入的这套 UAC 机制,据说是抄袭借鉴了 Unix/Linux 里面的 sudo 命令。不同的是,sudo 要输密码而 UAC 不用。

Win3.x 用过不记得了,Win9x 基本没有用户权限管理。到了 WinNT/2k/xp/2k3 时代,权限管理在我看来已经非常够用了,访问控制甚至比 Unix/Linux 里 owner/group/others 的三组 rwx 小开关精密得多。可毛病出在人身上,就像当年一个墨西哥老师常说的“问题总在桌子和椅子之间”。很多电脑用户根本不具备任何安全常识。就比方说我爸,事实证明他若有管理员权限,一天之内就能中 N 种病毒直至非重装不可。这样的用户不配当系统管理员。当然,话说得太直白让人很没面子,毕竟人家是付了钱的,买了系统不给权限还要羞辱人家很不厚道。于是从 Vista 开始,系统的第一个用户仍然是名义上的管理员,但真要干点什么大事就会被 UAC 拦住。新的程序会自动弹出一个确认框,老旧的程序(比方说这个有十多年历史的 StarCraft)根本不知道 UAC 的存在就直接报错返回了。

安全的最大隐患是人,当一个管理员主动运行木马把自己的银行账户发送给网上某台服务器时,电脑如何知道眼前的这人是有心还是无意?最无耻的也是人,自己犯错却可以推给无生命的东西,比如操作系统故障,比如网络游戏上瘾,比如枪炮火药原子弹,比如三年“自然”灾害。

UAC 实在是一个没有办法的办法,含糊了管理员的概念,(暂时)分掉了机器所有者的部分权限。可以想见在不久的将来,在病毒制造者和菜鸟用户的共同努力下这个方法也会渐渐失效,到时又会有更麻烦的解决方案。

权力与能力的斗争自古以来就让人头疼:

公司的 IT 管理员是否应该有最高权限,包括查看大老板电脑上的资料?技术派的观点倾向于肯定,不然 IT 怎么帮老板修电脑。从组织架构的角度看这个授权是不合理的 —— 凭什么一个和公司主营业务不相干的人可以了解那么多信息?这相当于让负责誊写盖章工作的太监掌实权。

一家上市公司到底谁说了算?CEO 还是董事长?前者是技术派,了解业务、人员和运作;后者是最大股东,换句话说公司是他的财产。

帝王和宰相谁说了算?前者拥有帝国,后者由前者任命,而后者太能干了对前者又是威胁,反客为主是常有的事。朱元璋集权力和能力于一身,他主张大权不可旁落,可偏偏后世的子孙没几个争气的,有十几年不上朝的,有专心做木匠的,有喜欢自己给自己封官玩的...

有权力的不一定有能力,有能力的不一定值得信任。世袭制还是代理人制,没有万全的选择。古往今来无数智慧的头脑都没有解决这个问题,我们又怎能指望电脑来帮我们决定,哪些决定我们要自己做,哪些权限我们可以委托给机器,哪些我们决定委托给机器做的决定在何种特殊情况下应返回给我们再次确定。这是一个关于决定的决定,也可能是一个关于决定的决定的决定,今后会变成关于决定的决定的决定的决定,请翻阅“递归”词条,很多制度的设计灵感来源于此。

2009年8月16日星期日

逛街

相比打游戏看电影,逛街从来不是我感兴趣的消遣方式。但听说有人在 Google 找了份代人逛街的工作,我还是相当羡慕。对了,工作地点在法国。



下面就是他的工作成果:

(点右上角看全屏,然后可以点箭头走路,或双击驻足某处,或拖拽改变视角)

这样逛街好处是不累,坏处是满足不了购物欲。好在现在有淘宝和快递,宅人们从此不再因物质匮乏横死于家中。用鼠标在异国街头漫步,我想起了久违了的艾泽拉斯大陆,那里我是孤独的行者。

2008年9月8日星期一

硬盘杀手

如果说 Wintel 联盟是 Microsoft 拼命增加软件复杂度,让 Intel 的 CPU 生意越来越好,那么和硬盘生产商穿连裆裤的是谁呢?

看看下面这张截屏就知道了:



McAfee Antivirus (mcshield.exe) 把所有别的程序读取的内容预读一篇,相当于 All ReadByte x 2。

剩下就是 Google 的新浏览器 Chrome 了,刚打开这东西不到半小时,它对硬盘的操作(读取/写入)居然是运行了一个多小时的两个 p2p 软件 (BT & eMule)之和。加上 Google Desktop 几乎占用所有硬盘写入操作的一半流量!!!

用工具追踪一下,发现 Chrome 大多数时间是在写一个叫 C:\Documents and Settings\\Local Settings\Application Data\Google\Chrome\User Data\Safe Browsing 的文件,想来大概相当于 IE 里面的 Cache,而这个文件居然不超过 40MB 。难道 Google 不能把这个文件在内存里实时更新,然后定期备份到硬盘么?

Google 在搜索领域的强势正是源于她迅捷而健壮的分布式海量文件系统 (file system)。可能,Google 的主要开发环境有自己的文件系统,而不是 Microsoft 这个用了十年的 NTFS,以至于 Chrome 的开发人员习惯性地依赖于文件系统而不是内存。于是我们 Windows 用户得到了一架在公路上奔驰的长着翅膀的飞机。

2008年9月6日星期六

喜新厌旧的浏览器

在中文 blog 上轻描淡写地总结了网景的失误后,Google 终于推出了自己的浏览器:



本着敌人的敌人就是战友的斗争策略,粉丝们摇旗呐喊把这看成是对 MSIE7 的挑战。殊不知,IE7 的用户都是那些最古板从不换浏览器的人。这个 Chrome 最先抢到的用户必然是那些使用 FireFox/Opera 的那群敢于尝新的年轻人。也好,攘外必先安内,不团结在一个更大的旗帜下如何与“邪恶”的 MS 帝国抗衡?

技术各有优劣,习惯以后也能客服。而审美疲劳则很难克服。今日的科技产品,美工设计上的创新比功能上的创新更能带来市场份额。君不见苹果公司的那些玩意儿,太漂亮了,不服不行。扯远了,我要说的其实是,一个新东西出来,又是免费的,人难免不去尝试一下。前些时候 FireFox 3 创下的下载记录,很快被 Google Chrome 打破。

连环画版中文手册在这里,稍懂一点技术的都能看懂。文件 7.08MB 用 Chrome 和 FireFox 下载了两次都没有下载完全。最后还是用跟随我十年的 NetAnt 拖了下来。这算不算是一个 bug 呢?MSIE7 的做法严谨一点,虽然不支持断点续传,但如果中间断了,它至少不会保存一个打不开的残文件。

至于 FireFox 可能再过一段时候我真不会用它了,标签页(tab)多了以后,常常出现渲染(render)问题。显然一个手工作坊出来的东西没有条件负担 MS 和 Google 这种大公司的测试力度。(每次 Build 之后的20~30分钟内,要用数以万计的网页进行测试,每周测试数百万网站 ---- 见上面的 Chrome 科普手册)

悲哀也好,无奈也罢,软件行业的英雄主义时代早已过去,降龙十八掌独孤九剑注定被淹没在万马军中。