Archive for 九月, 2009

实时显示Gravatar头像

by baiheinet on 九月 25th, 2009

实时显示Gravatar

在阅读一些外国Wordpress blog时,冰古都会留意到在留言的位置上会有一个Gravatar的图片,毫无疑问这是用于显示留言者的Gravatar。当我输入email地址后,我预计该Gravatar图片会实时地显示为我输入email对应的Gravatar。但很遗憾,在我写这篇文章之前我都没有发现有实时显示Gravatar的blog。没有,那我就弄一个吧。

实时显示也就是用JavaScript来实现,而Gravatar图片的链接没有什么秘密,很简单就能得到,“http://www.gravatar.com/avatar/”加上用md5转换email得到的一组字符串,就是该email对应的Gravatar头像图片。关键的是JavaScript没有内置md5加密函数,但也很幸运,早就有人编写了JavaScript的md5函数

既然有了md5函数,那实现实时显示Gravatar头像也就变得简单了,只需用onchange捕获email输入框中的变化,然后用hex_md5函数转换email地址并组合成对应的Gravatar图片链接,最后用setAttribute改变img的src地址就搞定了。相关的JavaScript代码如下:

<script type="text/javascript" src="js_md5.js"></script><!-- 这个js文件在http://pajhome.org.uk/crypt/md5/md5.html获得 -->
<script type="text/javascript">
/* <![CDATA[ */
var ga = document.getElementById("gravatar&quot ;) ;
var email = document.getElementById("email&quot ;) ;
// webkit的onchange事件似乎有点问题,用onblur代替。
var Ka=navigator.userAgent.toLowerCase();
var chrome = Ka.indexOf('webkit' ;)  != -1;


if (chrome) email.onblur = changeGravatar; else email.onchange = changeGravatar;


function changeGravatar(){ email_value = email.value; email_md5 = hex_md5(email_value); new_ga = "http://www.gravatar.com/avatar/" + email_md5 +"s=50&d=identicon&r=G"; newGravatar(new_ga); }


function newGravatar(new_ga){ ga.setAttribute('src', new_ga); } /* ]]> */ </script>

详细的代码可以看实时显示Gravatar头像 – 示例

留言测试来这里 :arrow: 为WordPress添加实时显示的Gravatar头像

Published by  Published by xFruits

Original source : http://bingu.net/644/real-time-gravatar/...

迪卡侬简介

by baiheinet on 九月 25th, 2009

在登顶启孜后,我已经从一个菜鸟成功升级为户外初级玩家,DKN店也去了有六七次,感觉DKN除了户外装备外,也蛮适合家庭购物买衣服买鞋的

迪卡侬有十几个自有品牌,分别对应不同类型的产品,我比较关注的东西包括:

  1. Quechua 户外系列. 首先是注意下面几个专利
    • novadry novadry 差不多相当于广告泛滥的 Gore-Tex 技术,简单说就是防水透气,没有这个专利的防水产品,透气性就差些了。
    • stratermic 这个定位是保暖,通常是抓绒衣?
    • equarea 这个定位是贴身排汗,买速干衣裤、内衣、袜子的时候注意一下有没有这个技术
    • vibram 这个不是迪卡侬自有的专利,是全球做登山鞋底的第一品牌。
    • AirCooling 这个主要是背包上使用,和背包另外一个相关的专利是 Symbium 背负系统 ,不过这个太专业了点儿,一般家用就不考虑了。

    这个系列陪我上山的东西包括:

    • 登山杖,500 light,经历过启孜峰大雪坡考验的。建议同时购买用于坚硬地面兼保护杖尖的橡皮头,29元一对
    • 背包,Forclaz 30 air,带有水袋出水口,自带雨罩——这次在山上碰到冰雹,立马感到这个额外防护的必要之处
    • 袜子2双,型号忘了。

    它的魔术头巾太没有性价比,而且花色只有一种。
    在这里给我家达达买过一件速干T恤和一条速干的7分裤。

  2. Tribord 这个是水上运动系列。
    我就买了一条平时擦汗的小毛巾,倒是给达达买了不少:比基尼,沙滩鞋
  3. Kalenji 都市步行/跑步系列
    上周六我全家都是穿这个牌子的鞋去爬山的,强烈推荐去看看它的鞋子。除了鞋子,还有跑步穿的衣服,相比较Q系更强调速干排汗的
  4. Domyos 休闲健身系列
    如果是 Quechua 定位是户外,Kalenji 定位是都市大街,Domyos 的衣服就定位在健身房里的穿着。达达有一件它的上衣
  5. Geonaute 电子配件/光学产品/运动包
    海拔表,这个以前说过了
    手电筒,在冲锋营帐篷里被我挂起来当电灯。特点是可以摇手柄自我充电,不过还没有机会使用这个特性
    相比较 Q 系来说它的包更休闲一些。买了一个给达达当书包
  6. Aptonia 运动防护
    我有时候强烈感到在三夫买的coolsun太烧包了,Aptonia的墨镜足够爬雪山用。不过这玩意涉及到眼睛保护,不敢大意,不清楚性能的前提下宁可买贵的。
    去三亚之前给达达买了一副小孩墨镜

它家的品类实在是包罗万象,虽然有些项目从来不玩,但货架也值得一逛——比如马术系列,有人就发掘出这个手套着实不错。

最后要说的是,去迪卡侬之前先在官方网站上大致浏览一下,看看哪些东西缺货,哪些打折,一个城市内也货比三家,一定可以节省不少时间和金钱。

Published by  Published by xFruits

Original source : http://www.dup2.org/node/1173...

Instant & Simplified Portfolios: Stacey

by baiheinet on 九月 25th, 2009

Stacey is an open source application for creating online portfolios with ease.

It is not a CMS application, the content is managed by creating folders & editing text files.

The application runs with PHP5 & does not require a database or has installation files, just upload & use.

Stacey Portfolio Creator

Stacey has these ready-to-use pages:

  • projects (where they are listed & different images can be viewed with a JS slider)
  • about
  • contact

The look & feel of the portfolio website can be customized by updating pure HTML files (no templating system is used).

Special Downloads:
Ajaxed Add-To-Basket Scenarios With jQuery And PHP
Free Admin Template For Web Applications
jQuery Dynamic Drag’n Drop
ScheduledTweets

Advertisements:
SSLmatic – Cheap SSL Certificates (from $19.99/year)
Dreamhost $50 Discount Code: WRD
Follow WebResourcesDepot At Twitter And Get More Resources!

Tags:

Related posts

天葬

by baiheinet on 九月 25th, 2009

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

天葬 - 小碌 - 碌碡画报

深入理解Apache的mod_rewrite

by baiheinet on 九月 25th, 2009

Shared by icyleaf

哈,中文版

原文作者:Joseph Pecoraro
原文链接:A Deeper Look at mod_rewrite for Apache
译者:jcky

 

     人们一提到.htaccess配置文件,首先映入他们脑海的就是用mod_rewrite进行URL地址重定向。对mod_rewrite的看法各不相同,为了就人们对mod_rewrite是怎么认识的有一个快速的看法,我在twitter上搜索了一下"mod_rewrite",并且将我写这篇文章时的前几个搜索页面的结果找出来:

midk:啊!.hatccess和mod_rewrite是如此的痛苦……

basterzenbach:我喜欢mod_rewrite。在我的有生之年,我都可以用它工作,并且还是不能精通它——太强大了。

mikemackay:仍然喜欢mod_rewrite的灵活性——又得到了拯救。这往往容易被忽略……并且要比你想想的要简单!

hostpc:我讨厌mod_rewrite。无法用它正常工作。

awanderingmind:噢,Wordpress 和Apache,你们带给了我烦恼。该死的mod_rewrite!

danielishiding:为什么mod_rewrite不工作了!该死!

      我注意到人们清楚的认识到了mod_rewrite的强大,但是往往在语法面前望而却步。考虑到Apache的mod_rewrite文档在前面几页说了同样的问题,这并不奇怪:

“mod_rewrite例子和文档的数量,尽管可以以吨来计算,但是它是巫术。该死的冷漠的巫术,但仍然是巫术。“——-布莱恩摩尔

      太糟糕了!因此,在本文中。我真的试图使mod_rewrite的难度降低一个档次。我不仅要去尝试解决mod_rewrite的的语法,还要设法提供一个工作流程,使你可以通过它调试和解决你的mod_rewrite问题。我也会给你一些有用的现实世界中的例子。

     然 而,在开始之前,我还要做一个警告。许多学科,尤其是这个,除非你自己动手尝试,否则你是不会学会的!这就是为何我会更专注于教授一个调试工作流程。像往常一样,如果你还没有加载模块,我会告诉你如何安装好你的系统。我敦促你们在你们自己服务器上做这些例子,如果是测试环境,则更好。你的经验和成功次数越多,你就会越容易将这种知识扩展到更高级的例子和应用。享受吧。

mod_rewrite的是什么?

      mod_rewrite的是一个Apache模块,可使服务器操纵请求的网址。根据一系列规则对传入的网址进行检查,规则中包含一个正则表达式来检测特定的格式。 如果在地址中发现了一个格式,并且满足适当的条件,该格式就会被一个替代的字符串或者是动作取代。这一过程一直在进行着,直到没有更多的规则或是程序被明确告诉停止。

     上面的内容可以总结为以下3点:

     *有一个按顺序排列的处理规则列表。
     *如果有一个规则相匹配,它会检查那条规则满足的条件。
     *如果一切都匹配,它会替代或这是做出一个动作。

mod_rewrite的优点

      用这样的一个地址重定向工具有很明显的优点,但是有一些东西也不是很明显。

      人们用mod_rewrite的主要原因是为了将丑陋的、神秘的网址转化为所谓的“友好的地址”或者是“干净的地址”。新网址通过多种方式变的友好,而不是仅仅一种。 它们是用户友好的,表现在可更容易为人类所理解,瞥一眼就可以,并且用户可能自己来操纵网址。作为额外的奖励,这些网址对搜索引擎来说也是友好的。创建友好的网址是一个搜索引擎优化技术,网址是一种有效描述他链接的内容的方式。看看下面的例子:

  1. 不是很友好: http://example.com/user.php?id=4512  
  2. 比较友好: http://example.com/user/4512/  
  3. 甚至更好:     http://example.com/user/Joe/
      最后的链接不仅仅是看上去变的简单了,它还可以使搜索引擎从中提取语义。这种基本的URL重写机制是使用mod_rewrite的一种方式。然而,正如你将要看到的一样,除了这些简单的转换,它还可以作很多的事情。

      将同一个例子扩展一下,一些人声称通过用mod_rewrite改变你的网址可以获得安全效益。给出同一个例子,想像,考虑一下下面这个对用户id的攻击:

  1. http://example.com/user.php?id=AHHHHHH  
  2. http://example.com/user/AHHHHHH/ 
      第一个例子是明确的PHP脚本调用,并且必须得处理无效的ID号。写得不好的脚本可能会失败,更极端的情况是(写得不好的Web应用程序)错误的输入可能导致数据损坏。然而,如果只给用户显示友好的网址,也就是说他们甚至不知道user.php网页的存在,他们可能只知道友好的URL结构。试图在这种情况下进行的攻击可能在读取PHP脚本之前就已经失败了。这是因为mod_rewrite的核心是正则表达式的格式匹配。在上面的例子中,你的地址中可能有一个数字,比如(\ d +),而不是字符,像a-z,当重写模块找到的是字母而不是数字时,重写就会失败。
 
      从安全的角度讲,这种额外的抽象功能是不错的。如果你愿意,你甚至可以防止直接访问原始PHP脚。不过,我们决不能使用mod_rewrite来替换一般的安全措施,你的脚本应当在服务器端进行验证。
在服务器上启用mod_rewrite模块
      就像启用.htaccess支持一样,启用mod_rewrite或者是其他apache模块必须修改全局配置文件(httpd.conf)。就像前面说的一样,由于mod_rewrite用的是如此广泛,主机提供商几乎总是启用这个模块的。然而,如果你怀疑你的主机提供商没有启用它(我们会在下面测试),你应当联系他们,并且他们很乐意启用它。
      如果你是自己安装的Apache,毫无疑问,当编译Apache的时候,要将Mod_rewrite模块包括进来,因为默认情况下是不包括它的。然而,它是用的如此普遍,几乎所有的安装指南,包括Apache的安装文档都会在他们的示例中指出如何将它编译进来。然而,预先包装的版本已经将它启用了。如果你正在读这篇文章,那么你的Apache有99%的可能已经将mod_rewrite模块编译进来了,所以你只须进入下一个步骤。
 
      如果你是你们网络的网络管理员,并且你想确认一下你已经加载了这个模块,你应当检查一下httpd.conf文件。在配置文件有很大一部分用于加载那一大堆模块。下面的行可能会出现在文件中,如果是,好极了!如果它被注释掉了,或者说是在它前面有一个#号,哪么你只需将#号删除掉,留下下面的这一部分:

1、LoadModule rewrite_module modules/mod\_rewrite.so 

      老版本的Apache1.3,可能需要你在LoadModule目录中加上以下目录:
  1. # Only in Apache 1.3  
  2. AddModule mod\_rewrite.c  
     然而,这好像在Apache 2及以后的版本中消失了,只需要LoadModule指令。
     如果你不得不修改配置文件,那么你必须重启你的apache服务。你要记住备份你的原始文件,以防万一你需要将它还原回以前的版本。
测试mod_rewrite模块
      你可以通过多种方式测试mod_rewrite模块是否启用(或者是工作)了,最简单的方法是查看PHP的phpinfo函数的输出。创建下面的这个非常简单的PHP页面,在你的浏览器中打开它,并且在输出结果中找一下"mod_rewrite"。
<?php phpinfo(); ?>  
      mod_rewrite应该会显示在网页的“Loaded Modules”部分中,就像这样:
       然而,如果你用的不是PHP(虽然在接下来的教程中我会用它),还有很多方式来测试。Apache有许多命令行工具。
      在我的基本身份验证的第一个教程中,我提到了在htpasswd的工具。你可以使用诸如apachectl或者httpd的其他工具直接对模块进行测试。有命令行开关可以使你检查现有的已经安装加载的模块。您可以执行下面的命令来得到一个所有已加载的模块的列表。
shell> apachectl -t -D DUMP_MODULES   
      这里我展示的是这个命令的帮组页面。然后,我运行了这个命令,并在结果中查找了“rewrite”,有一行输出与之相匹配。
      最后,如果你还是不能确定它是否启用了,像以前一样将它注释掉,看看会发生什么!之后,我会介绍语法,但这里仅仅是一个测试,看看他是否工作了。下面的.htaccess文件将重定向任何给定的文件夹请求到good.html文件,这意味着如果你的mod_rewrite工作了,你应该看到good.html。如果mod_rewrite不工作,那么你会看到一个带警告的index.html。
  1. # Redirect everything in this directory to "good.html"  
  2. RewriteEngine on  
  3. RewriteRule .* good.html  
    下面是正确的和错误的页面:
.htaccess的内容
     通常情况下,你可以写在.htaccess文件中的内容也可以写到全局配置文档中。在mod_rewrite中,如果你将一条规则放的文件不同,会有一点儿小差异。最明显的是:
如果你将【……】规则放到了.htaccess文件中,目录的前缀(/)在REQUEST_URI变量中会被去掉,因为所有的请求会被自动假设是现在目录的相对地址。——Apache文档
     有一点要记住,如果你在网上看例子或者是你自己在测试一个实例,要注意前面的斜线!当我将一些例子放到一起的时候,我将在下面试图澄清这些问题。
正则表达式
      本教程不打算教你正则表达式。对于那些你知道的正则表达式,mod_rewrite中用到的正则表达式会根据Apache版本的不同而有所改变。在Apache 2.0中,他们似乎是与Perl兼容(pcre)的正则表达式。这意味着许多你所使用的简写,例如\w的意思是[A-Za-z0-9],\d的意思是[0-9],以及更多不存在的简写。但是,我的公司使用的是Apache 1.3,并且Apache1.3的正则表达式是比较有限的。
      如果你不知道正则表达式,下面这些有用的教程会让你快速入门:
     还有每个人都应该知道的一些引用:
     如果有还没有花时间去学习正则表达式,我强烈建议你花点时间学习一下。因为通常情况下,他们没有你想象的那么复杂。我从多年的经验中选择了上面的那些关于正则表达式的链接,我觉得这些指南对于学习最基础的东西来说,写的很好。如果你想有效的利用mod_rewrite,正则表达式是至关重要的,在其他方面,了解他们也很有用,如在你最喜爱的代码编辑器中使用“查找/替换”。
初次体验
     好了,你等待的耐心已经足够大了,让我们快速的看一个例子。这个例子在链接的源代码中有。这里只给出.htaccess文件的代码:
  1. # Enable Rewriting  
  2. RewriteEngine on  
  3.   
  4. # Rewrite user URLs  
  5. #   Input:  user/NAME/  
  6. #   Output: user.php?id=NAME  
  7. RewriteRule ^user/(\w+)/?$ user.php?id=$1 
     在我对它做任何解释之前,我会先讲解一下目录中的另外一个文件。
     目录中包含两个文件:index.php和user.php。index.php中有一些指向user页面的链接或者是各种各样的格式。php代码用来显示页面被请求了,并检查传过来的"id"参数。下面是user.php的代码:
  1. <?php  
  2.   
  3. // Get the username from the url  
  4. $id = $_GET['id'];  
  5.   
  6. ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  
  7.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
  8. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">  
  9. <head>  
  10.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>  
  11.     <title>Simple mod\_rewrite example</title>  
  12.     <style type="text/css"> .green { color: green; } </style>  
  13. </head>  
  14. <body>  
  15.   <h1>You Are on user.php!</h1>  
  16.   <p>Welcome: <span class="green"><?php echo $id; ?></span></p>  
  17. </body>  
  18. </html> 
       这个例子有一些不同的地方。首先,请注意URL重写必须通过RewriteEngine指令启用!如果你的htaccess文件要使用重写规则,应始终包括这行,否则你不能确定它是否启用了!作为一个经验法则,总是将它包括进去并确保每个.htaccess文件中你只包含了一个。字符串“on”不区分大小写,因此,当你在网上看到其他的例子用的是“On”,这是可以接受的。
     第一个重写规则是用来处理user.php页面的。就像这些注释说的一样,我们正在将友好的网址重写为正常的URL格式。为了做到这一点,当输入友好的网址时,事实上,我们将它转化成了标准的查询字符串URL。将它分解开,我们就得到了:
  1. T规则:  
  2. RewriteRule ^user/(\w+)/?$ user.php?id=$1  
  3.   
  4. 匹配模式:  
  5. ^             输入的开头
  6. user/          以“user/“开始的请求地址  
  7. (\w+)        提取所有的字母,并将提取的结果传给$1  
  8. /?             可选的斜线 "/"  
  9. $              输入结束  
  10.   
  11. 替换为:  
  12. user.php?id=   要用到的字符串.  
  13. $1             上面第一个提取到的字符串。  
     下面是一些例子及对上面每行话的解释:
User.php
输入 匹配 提取 输出 结果
user.php?id=joe No   user.php?id=joe Normal
user/joe Yes joe user.php?id=joe Good
user/joe/ Yes joe user.php?id=joe Good
user/joe/x No   user/joe/x Fail
      因此,第一个例子不会受到重写规则的影响,并且可以正常访问。第二个和第三个例子与重写规则相匹配,会根据重写规则被改写,可以正常访问,最后一个例子不符合规则且无法访问。服务器没有用户目录,不能试图找到它。这是预期的结果,因为user/joe/ x是一个无法访问的网址!

     这个例子比较容易理解。然而,为了澄清任何更复杂的事情,就像我现在做的一样,我必须要花好几分钟去注意细节。在下一节中,我们将举一个更复杂的例子,这个例子涉及所有重写的核心内容。

 

      注意:如果这个例子不能在你的机器上运行,可能是由于你的Apache或mod_rewrite 版本与PCRE不兼容。请尝试着将^user/(\w+)/?$改为 ^user/([a-z]+)/?$。 请注意,我没有使用\w的缩写。如果此版本可以在你的机器上正确运行,那么你不要使用正则表达式的缩写,要使用较长的当量(见上面的正则表达式节)。
执行流程详情
     重写规则的执行流程比较简单,但不是完全明了。因此,我将叙述一下细节。这一切都开始于用于向你的服务器提出请求的时候。他们在浏览器地址栏中键入网址,他们的浏览器将之转换成一个HTTP请求并发送到服务器,Apache收到这一请求,并将之解析成片断。下面是一个例子:

      请注意,每当我提到Apache的变量,我使用了一种奇怪的语法:%{APACHE_VAR}。这是因为它类似于mod_rewrite访问变量的语法。不过,括号内名字是重要的。
      那么,mod_rewrites是如何工作的?如果你用的是.htaccess文件,那么你只需输入REMOTE_URI部分,但没有开始的斜线!我之前提到过这个,对大多数刚刚开始用它的人来说,这显得很混乱。如果你是将它添加到了全局配置文件里,那么你应当加上斜线。
 
      为了说的更具体一点儿,下面是Apache的文档中对mod_rewrite中“URL部分”的描述:
该模式始终是对请求的URL路径进行正则表达式匹配(主机名后面的那部分,但在任何以问号为标志的显示查询字符串的前面)。 Apache文档
      为了消除大家的模糊不清的认识,下面用黄色高亮显示的两个网址是mod_rewrite在.htaccess文件中的“部分网址”:
      在本节接下来的部分我将利用这两个网址来描述执行的流程。我将把第一个网址称为“绿色”网址,第二个称为“蓝色”网址。在整个分析中,我还将使用“URL部分”来表示开始处没有斜线的REMOTE_URI。
 
     对于那些想要100%的区分开这两中教法的人,我这里说的URL其实是URI。一个统一资源标识符(URI)的定义有别于统一资源定位符(URL)。一个URI只是标识资源在哪里,这意味着存在多个URl可以指向相同的资源,但是他们是不同的地址。一个URI可能在找到资源之前经过了数次跳动和重定向。然而,URL却是标识资源的确切位置。这种细微的差别随着时间的推移,变得越来月模糊,以至于没有人关心它们的差异。我将继续使用术语URL,因为人们用它更舒服一些。
 
     所以,现在我们知道重写规则将要采取行动了。一旦Apache已解析出请求,它就会将它翻译成它认为的文件,并去读取该文件。在这个过程中,他会搜索.htaccess文件。假设,.htaccess文件起用了RewriteEngine,那么任何重写规则都可以更改网址。地址的急剧变化(如Apache将某个网址原来指向的目录替换为另外一个目录)将促发Apache发出子请求,进而获取新的文件。 
      在大多数情况下,你是可以看到子请求的。这些实现细节对于了解你写的或使用的大多数简单的重写规则来说并不重要。更重要的是知道Apache如何处理.htaccess文件中的重写规则。
 
      .htaccess文件中的规则会以它们出现的顺序被处理。请注意,每个重写规则都是“部分网址”,也就是说类似于REMOTE_URI。当一个规则促发替换的时候,修改后的“部分网址”将被移交给下一个规则。这意味着,正在处理的网址可能已经被前面的规则修改过了,网址会被每个相匹配的规则更新。这一点很重要!
 
      下面是一个流程图,它试图提供URL在通过含有多个规则的.htaccess文件时的执行过程:
     请注意,流程图的顶部的将会与重写规则进行匹配的数据是“网址部分”,如果替换成功,则修改过的网址会与下一条规则继续匹配。 
      前面,我介绍了重写条件,但是没有详谈。每个重写过程都与一条重写规则相关联。条件出现在与它们有联系的规则之前,但是只有与规则相匹配了,网址才会得到评估。正如流程图所示,如果与一个重写规则相匹配了,Apache会检查这条规则有什么条件(即做出替换是否需要其他条件)。如果没有条件,那么将进行替代并进入下一步。如果需要条件,那么只有所有的条件都成立的时候,才会进行替换。举一个具体的例子。
 
      我用的网址实际上是我放在"profile_example"目录中的源代码的一部分。这和前面的例子user.php一样,但现在有一个profile.php页面,一个附加的重写规则,和一个条件!让我们看一下这段代码和它在Apache中的执行过程:
     这里有两个规则。规则#1和我们前面看到的user例子一样。规则#2是新加的,注意它有一个条件。在“网址部分”我们已经讨论过会从上到下遍历每一条规则。因此,必须先经过规则#1,然后才是规则#2。
 
     理解这个例子的关键是首先要了解目标。在这个例子中,我允许友好网址,但实际上,我要明确地禁止直接访问PHP页面。请注意,有些人可能会说这是一个坏主意。他们可能会说,作为开发者,这个调试起来会更难。是这样的,事实上我不推荐做这样的小把戏,但是作为一个例子,这很好。更实际的使用mod_rewrite的例子会在本教程后面的部分看到。
 
      因此,在这一点的基础上,让我们看看我绿色网址发生了什么。这次,我们希望取得成功。
      在最上面,可以看到Apache的THE_REQUEST变量。我把它放在上方是因为它不像我们要处理的其他Apache变量,在请求期间这个变量的值不会改变。这就是规则#2使用%{THE_REQUEST}的原因之一。在THE_REQUEST下面,我们看到绿色的“网址部分”开始进入第一个规则了: 
  • URL匹配成功。
  • 没有任何条件,因此继续。
  • 进行替换。
  • 没有任何标志,因而继续。 
      通过第一条规则后,该网址已经更改。网址已被重写成了profile.php?id=joe,这时,Apache会听下来更新它的大多数变量。我们看不到?id=joe,新的“网址部分”会进入下一条规则。这是我们第一次遇到条件:
  • URL匹配成功。
  • 还有条件,我们将检查条件。
  • THE_REQUEST不包含profile.php,因此条件检查失败。
  • 因为不满足条件,所以我们忽略替换和标志。
  • 这条规则没有改变URL。
      这一次,我们通过了所有的重写规则,并且profile.php?id=joe 页会被正确的提取。
    
      下面介绍关于如何执行蓝色的URL,这一次,我们要失败:
    我再次将THE_REQUEST的值放在了最上面,蓝色的“网址部分”进入规则#1: 
  • URL匹配失败。
  • 其他的一切都被忽略,网址没有改变,进入下一步。 
     第一个规则很容易。通常情况下,如果URL匹配失败,那么它会原样进入下一步。现在进入规则#2: 
  • URL匹配成功。
  • 有条件需要比较,因此会先测试条件。
  • 请求包含 profile.php,因此条件测试通过。
  • 通过所有的条件,我们可以替换网址了。
  • ”-”是一个特殊的替换,这一为着任何东西都不会改变了。
  • 规则中有标志,因此我们处理标志。
  • 有一个F标志,意思是返回一个禁止访问响应。
  • 一个403 Forbidden响应发送到了客户端。
     有几件事情值得再重复一次。为了使替换发生,所有条件都必须检查通过。在上面这种情况下只有一个条件,并且检查通过了,所以,可以对网址进行替换。注意,有一种特殊的替换,不改变任何东西。当你想用标志做点儿什么的时候,这种方法相当有用,在这种情况下,我们就会这样做(指的是,替换后什么都不改变)。
 
     下面是一个URL例子的分解和它们的返回值表:
Profile.php
输入 匹配 获取 输出 结果
profile.php?id=joe Yes (#2)   profile.php?id=joe Forbidden
profile/joe Yes (#1) joe profile.php?id=joe Good
profile/joe/ Yes (#1) joe profile.php?id=joe Good
profile/joe/x No   profile/joe/x Fail
语法
      在介绍重写规则(RewriteRule)和重写条件(RewriteCond)的语法之前,我建议你先下载theAddedBytes Cheatsheet。这是因为cheatsheet表列出了最有用的服务器变量,标志,并有正则表达式技巧,甚至还有几个例子。在那里面有这么多的内容,将它们关联起来是很难的。 

      让我们从重写规则开始。如果你想做一些特殊的事,你可以随时查看Apache的关于重写规则的文档。下面是我的概述:

     这个表显示了什么类型的标志是可用的。许多指南涵盖了flags的详细讲解,我会通过通过下面的例子介绍一下我认为的用的最多的flag。
 
    下面是Apache的RewriteCond文档和我的概述:
调试流程
     当你使用mod_rewrite制定新规则的时候,总是以一个简单的规则开始,并且逐步发展为最后的版本。从来不要试图一下子将所有的事情办好。对于重写条件的编写,这个道理同样适用。一次添加规则和条件,多次测试! 

      我正在介绍的这种方法的关键之处是它可以让你知道是否你的一个改变不能正常工作或者是使某个地方运行不正常。当一次做得太多的时候,你会不可避免的遇到错误,并且你将不得不恢复你所做的一切更改来找出问题到底是出在那儿了。这是一项非常艰难的 工作,可能会导致你的失望。不过,如果你总是稳步推进,并且在每一步都可以到达一个可以正常运行的点,你的处境就会稍好一点儿。

      人们往往忽略这条建议,创建了一个复杂的规则,最终却不能工作。几个小时后,他们发现问题没有出现在复杂的部分,反而只是简单的正则表达式错误,如果他们按我上面解释的构造规则的换,问题可能早已经被发现了。在反向工程拆解规则上,这种方法也适用。这种做法将极大降低人们的失望!
例子

      在下面的例子中,我总是会假设网站的域名是example.com。此域名很重要,因为它会影响HTTP_HOST变量以及在你的网站上将指定的URL重定向到另一个文件。如果你打算修改你的任何一个例子,以便它可以在你的网站上工作,请记住这一点。如果是这样,只需用你的域名替换“example.com”。例如,Nettuts会将“example.com”改为“nettuts.com”。 
删除www 

     这是最经典的重写规则。这将使得每个通过http://www.example.com访问你网站的人会得到一个硬性的重定向,从而其浏览器的地址栏中也将进行相应更新。 
  1. RewriteEngine on   
  2. RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]  
  3. RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]  
     这条规则与任何输入的地址都匹配,并将所有的地址保存为$1。本例中的重要组成部分是条件语句,这个条件会检查HTTP_HOST变量,看它是否以“www”开始。如果是这样,重写就会发生:
  • 替代的是一个完整的URL (它以http://开始)
  • 替代中包含早期抓取的 $1。
  • [R=301]标志将浏览器重定向到重写过的网址,在某种意义上说,这是硬性重定向,它是浏览器加载新的页面,并用新的URL地址更新地址栏。
  • [L]标志的意思是这是最后需要分析的一条规则,重写引擎应该停止了。
      如果传入的URL是“http://www.example.com/user/index.html”,那么HTTP_HOST是beenwww.example.com,重写会创造http://example.com/user/index.html。 

      如果传入的URL是“http://example.com/user/index.html”,那么HTTP_HOST是beenexample.com,不满足条件,重写引擎将会保持网址不变。 

禁止盗链

      盗链,在维基百科中被称为内联链接,是用来描述一个网站读取另一个网站的内容。通常一个网站,读取者,将包括一些其他网站上的媒体文件的链接(让我们说成是一个图像或视频)——包含内容的主机。在这种情况下,内容主机的服务器会浪费带宽为其他网站提供内容(译者注:图像、视频等)。 

    对许多人来说,如果其他网站链接他们的内容,这很好。然而,许多人宁愿防止盗链,为了不支付将本网站内容发送到其他网站产生的额为的带宽。 

     最常见的、基本的防止盗链是的方法将一些网站加进空白页列表,并阻止其他的一切访问。你可以通过检查引用的内容来找出谁正在从你的网站访问那些内容。HTTP_REFERER头(是的它是这样拼写的)是由正在访问资源的浏览器或客户端设置的。最后,这是不是100%可靠的,但它是禁止大多数盗链的最有效的方法。因此,你只需验证引用是否在空白页列表中。如果引用是不能接受的(空白或其他人的网站),那么你可以给他们发送禁止警告: 

  1. # 给盗链着发送403禁止访问警告。
  2. RewriteEngine on
  3. RewriteCond %{HTTP_REFERER} !^http://example\.net/?.*$ [NC]  
  4. RewriteCond %{HTTP_REFERER} !^http://example\.com/?.*$ [NC]  
  5. RewriteRule \.(gif|jpe?g|png|bmp)$ - [F,NC]  
    在这里,RewriteRule检查的是任何一个主流类型的图像文件,例如的.gif,.png或.jpg。如果你想保护.flv,.swf或者是其他文件,你可以添加其他扩展到这个列表中。 

      被允许访问的域名是“example.net”和“example.com”,在这两种情况下,重写条件验证将失败,替代也不会发生。如果有任何其他域名尝试访问,比如说说“sample.com”企图访问,那么所有的重写条件会验证通过,替代会发生,比且[F]禁止动作将被触发。 

给盗链者发送一张警告图片

     当有人试图从你的服务器上读取内容时,前面的例子会返回404禁止访问警告。实际上,你可以更进一步,给盗链者发送你选择的任何资源。例如,您可以发送一个有用的以文字“盗链不允许”表述的图片警告。这样,其他人能够意识到他们自己的错误,并在他们的主机上保存一份副本。唯一的变化是改变替换方式,并提供一个已经选好的图片来代替正在被访问的资源: 
  1. # 重定向盗链者请求为 "warning.png"  
  2. RewriteEngine on  
  3. RewriteCond %{HTTP_REFERER} !^http://example\.net/?.*$  
  4. RewriteCond %{HTTP_REFERER} !^http://example\.com/?.*$   [NC]  
  5. RewriteRule \.(gif|jpe?g|png|bmp)$ http://example.com/warning.png [R,NC]   
      注意,这是一个我称之为“硬”或“外部”重定向的例子。该重定向规则在他的替换部分有一个URL和一个[R]标志。 
自定义404 错误

    一个窍门:你可以用htaccess检查目前的“URL部分”是不是链接到服务器上的实际文件或Web目录,这是一个创建自定义404“文件未找到”页面的好方法。例如,如果用户试图读取特定目录中不存在的页面时,你可以重定向它们到任何网页,如Index页面或自定义404页。 
  1. # 显示“custom_404.html”页的通用404页
  2. # 如果请求的页面不是一个文件或目录 
  3. #静态重定向:用户的地址栏的内容不变。 
  4. RewriteEngine on  
  5. RewriteCond %{REQUEST_FILENAME} !-f  
  6. RewriteCond %{REQUEST_FILENAME} !-d  
  7. RewriteRule .* custom_404.html [L]  

      这是mod_rewrite文件测试的很好的例子。它同bash shell脚本、甚至是Perl脚本文件测试相似。这里的条件检查REQUEST_FILENAME是不是一个文件或目录。在都不是的情况下,则没有这样的文件反馈给这个请求。 

      如果传入的请求文件无法找到,那么返回一个“custom404.html”页面。注意有没有[R]标志,所以这是一个静态重定向,而不是硬重定向。用户的地址栏将不会改变,但网页的内容是“custom404.html”,简短而简单。 

安全第一 

     如果你有经常使用的mod_rewrite代码片段,并想轻松地分发到其他的服务器或环境中,你可能得要小心。如前所述,任何一个.htaccess文件的无效指令都可能会引起内部服务错误。因此,如果你的代码片段要移动到的环境没有mod_rewrite,你可以先暂停一下。 

      一个解决这个问题是mod_rewrite模块的“检查“指令”,任何一个模块都有这个指令。只要将你的mod_rewrite代码放到<IfModule>块中,你可以这样设置: 

  1. <IfModule mod_rewrite.c>  
  2.   
  3.   # Turn on  
  4.   RewriteEngine on  
  5.   
  6.   # Always remove www (with a hard redirect)  
  7.   RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]  
  8.   RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]  
  9.   
  10.   # Generic 404 for anyplace on the site  
  11.   # ...  
  12.   
  13. </IfModule>  

结论 

      我希望本教程能够证明mod_rewrite没有想象的那么恐怖,并且事实上通过精心设计,它的复杂性和访问速度问题都可以避免。

添加评论

译言联合3G门户推出无线官网,手机看译言,登录wap.yeeyan.com

Published by  Published by xFruits

Original source : http://www.yeeyan.com/articles/view/jcky/59298...

HTTPS连接最初的若干毫秒

by baiheinet on 九月 25th, 2009

Shared by LaiYonghao

当你在浏览了一个网站上面的商品之后,点击“继续并结帐”时会发生什么?本文即将对(浏览器)与Amazon建立安全连接的整个过程中最初的若干毫秒进行分析。

作者: Jeff Moser
译者: 马国耀
原文链接:http://www.infoq.com/cn/articles/HTTPS-Connection-Jeff-Moser

当你在浏览了一个网站上面的商品之后,点击“继续并结帐”时会发生什么?本文即将对(浏览器)与Amazon建立安全连接的整个过程中最初的若干毫秒进行分析。当你点击继续按钮时一个新的页面将被加载:

1

在短暂的220毫秒内,发生了很多有趣的事情,Firefox修改了地址栏的颜色,并在其右下角放置了一个锁状的图标。在我最喜爱的网络工具Wireshark以及略微修改的Firefox调试版的帮助下,我们可以对正在发生的事情看个究竟。

根据RFC 2818协议的规定,Firefox明白“https”意味着它应该连接Amazon.com的443端口

2

大多数人将HTTPS和SSL(Secure Sockets Layer)联系起来,SSL是Netscape公司在90年代中期发明的。随着时间的推移这种说法就渐渐变得不准确了。由于Netscape失去了市场份额,它将SSL的维护工作移交给因特网工程任务组(IETF)。第一个后Netscape版本被重新命名为安全传输层协议(TLS),TLS1.0是在1999年1月份发布的。由于TLS诞生都10年了, 所以真正的“SSL”传输其实是几乎见不到。

Client Hello

TLS将所有的网络传输打包成不同的“记录”类型。我们看到从浏览器出来的第一个字节是一个十六进制(hex)字节0x16=22,这说明它是一个“握手”记录:

3

后面的两个字节是0x0301,意味着它的版本是3.1,事实上TLS1.0就是SSL3.1。

“握手”记录被分解成若干消息。第一个就是“Client Hello”消息(0x01)。这里面有很重要的几点:

  • 随机数:
    4
    前面的四个字节是当前的协调世界时(Coordinated Universal Time,UTC),它的格式是Unix时间戳,也就是从1970年1月1日起到此刻所经历的秒数。在本例中的该数字是0x4a2f07ca。跟随其后是28字节的随机数,它将在后面使用。
  • 会话标识(session id):
    4-1
    在这里它是空值或者是null。如果在几秒前该浏览器曾连接过Amazon.com,它就可能继续使用前面的会话,而不需要重新执行整个“握手”过程。
  • 密码套件:
    4-2
    它是浏览器所支持的密码算法的一个列表。最上面的是一个很强大的组合“TLS_ECDHE_ECDSA_与_AES_256_CBC_SHA,下面还有该浏览器支持的另外33个选择。如果现在不明白它们的含义也不必担心,后面你将会发现Amazon并没有选择最上面的强大组合。
  • server_name extension:
    4-3
    通过它告诉Amazon.com,浏览器正要连接https://www.amazon.com/。这样做非常方便,因为TLS“握手”发生在所有的HTTP传输之前 。HTTP协议中有一个“Host”头, 这就允许了Internet托管公司出于成本的考虑将上百个网站绑定在同一IP 地址上。传统意义上SSL要求每一个地址有一个不同的IP,而这个扩展就使得服务器能够正确响应浏览器所请求的(服务器)证书。最后注意一点,对于 IPv4的地址这一扩展的有效期大概能再多一周左右。

Server Hello

对应于Client Hello,Amazon.com也返回一个“握手”记录,它是两个庞大的数据包(2,551字节)。该记录的版本号是0x0301,也就意味这Amazon支持我们使用的TLS1.0版本的请求。这个记录分成三个子消息,他们包含着一些有趣的信息。

  1. "Server Hello" 消息(2):
    5
    • 我们得到服务器返回的四字节的Unix时间戳以及28字节的随机数,它也将在后面使用(译注:注Clien Hello是发了一个随机数,这两个随机数将用于产生最后的对称密钥)。
    • 一个32字节的会话标识,有了它,随后重连服务器就不需要再执行一个完整的握手过程了。
    • 从我们提供的34个可选的密码套件中,Amazon选择的套件“TLS_RSA_WITH_RC4_128_MD5”(0x0004)。也就是说它将使用“RSA公钥算法来验证证书以及交换密钥,用RC4加密算法对数据进行加密,使用MD5哈 希算法来校验消息内容。后面会对它们做详细介绍。我个人认为Amazon选择这个密码套件的原因是出于自私的考虑(译注:这里说“自私”的意思 是,Amazon出于性能的考虑,降低了安全的强度)。这个套件是这34个套件中消耗CPU最少的一个,因此Amazon选择它就是为了节省一些CPU来 处理更多的用户连接。还有一个不大可能的原因是他们要特别地向Ron Rivest致敬,这个套件中所用到的三个算法都是他发明的。
  2. 证书消息(11):
    5-1
    这个巨大的消息占据了2464个字节,它是一个证书,客户端用它对Amazon进行认证。它并不是什么花哨的玩意,通过浏览器就可以看到它的大部分内容:
    5-2
  3. “Server Hello 结束”消息(14):
    5-3
    这是一个0字节的消息,它告诉客户端“hello”过程已经完成,也就意味着服务端将不验证客户端的证书。

校验证书

浏览器必须要确定它是否要信任Amazon.com,在这里是通过证书判断的。它检查Amazon的证书并且检查现在的时间是否在证书的有效期之内,该有效期规定的是“不能早于”2008年8月26日且“不能晚于”2009年8月27日。此外,它还要确保该证书的公钥已经被授权在进行密钥交换的过程中使用。

为什么我们应该相信这个证书呢?

在证书上附有一份“签名”,这个签名事实上是一个big-endian(译注:Big-Endian和Little-Endian是一种二进位资料储存或传输的格式,Big-Endian的最高位字节在最前头,而Little-Endian的最高位字节在最后面)格式的长整型数:

6

任何人都有可能发给我们这些字节,为什么我们要相信这个签名呢?为了回答这个问题,有必要先到这里mathemagic land去速成一些相关知识:

穿插:简短的,不那么可怕的RSA向导

有时候人们想知道数学和编程有何联系。证书就是应用数学的一个非常实际的例子。Amazon的证书告诉我们应该用RSA算法来校验其签名。RSA是MIT的教授Ron RivestAdi ShamirLen Adleman在70年代创造出来的,他们三人创造了一个巧妙的方法2000多年来 数学发展的思想汇合起来形成了一个漂亮而简单的算法

首先选择两个很大的质数“p”和“q”,并对他们求积得到“n=p*q”。接下来,取一个较小的“e”作为指数,它用作“加密指数”,而对e的进行特殊的逆反函数计算所得到的“d”作为“解密指数”。然后将“n”和“e”公开出去,而对“d”要保密,对于“p”和“q”你可以把它们扔掉,也可以像“d”一样保密起来。真正重要的要记住“d”和“e”是相互的逆反。

现在,如果你有一些消息,那么你只需要将该消息的字节翻译成一个数“M”,若要对这个消息进行“加密”形成“密文”的话,你就这么计算:

C ≡ Me (mod n)

它意思是先求“M”的“e”次方,然后对它应用模数“n”求余。举个例子,11AM +3 hours ≡ 2 (PM)(mod 12 hours)。接收者知道(解密用的)“d”,而“d”可以对已加密的消息进行反转并还原消息:

Cd ≡ (Me)d ≡ Me*d ≡ M1 ≡ M (mod n)

另一件有意思的事情是拿着“d”的人可以对一个文档进行签名,其做法是文档“M”求“d”次幂然后应用模数“n”求余数“S”:

Md ≡ S (mod n)

这种做法成立的原因是“签名者”将“S”,“M”,“e”以及“n”公开出去,任何人都可以通过这样一个简单的计算来验证“S”是否由“签名者”所 签(译 注:因为每个“e”都是某个签名者所独有的,而“e”和“d”是成对出现的,所以签名者用自己的“d”签名,只能拿这个“d”所对应的“e”才能还原消 息,这就到了签名的作用):

Se ≡ (Md)e ≡ Md*e ≡ Me*d ≡ M1 ≡ M (mod n)

像RSA这样的公钥密码算法经常被称之为“非对称”算法,因为加密的密钥(本例子中的“e”)和解密的密钥是不相同的(本例子中是“d”)。对所有的数应用“mod n”的目的是使攻击者不可能使用简单的技术(如过去我们使用的对数)破解它。RSA的神奇之处是你可以很快计算/加密C ≡ Me (mod n),而在不知道“d”的情况下计算/解密Cd ≡ M (mod n)是非常困难的。如前面所说,“d”来自于对“n”的因子分解,而“n”来自于“p”和“q”,求解“d”是一件复杂的事情。

签名验证

在现实世界里使用RSA时应该谨记的重要的一点是,前文提到的所有数字都应是很大的数,只有这样才能保证,即使用目前最好的算法也 很难攻破上述算法。到底多大才算很大的数呢?Amazon.com的证书是由“VeriSign Class 3 Secure Server CA.” 签名的。从这个证书中我们可以看出,VeriSign所使用的模数“n”是一个2048比特长的数字,表示成10进制数的长度是617位:

1890572922 9464742433 9498401781 6528521078 8629616064 3051642608 4317020197 7241822595 6075980039 8371048211 4887504542 4200635317 0422636532 2091550579 0341204005 1169453804 7325464426 0479594122 4167270607 6731441028 3698615569 9947933786 3789783838 5829991518 1037601365 0218058341 7944190228 0926880299 3425241541 4300090021 1055372661 2125414429 9349272172 5333752665 6605550620 5558450610 3253786958 8361121949 2417723618 5199653627 5260212221 0847786057 9342235500 9443918198 9038906234 1550747726 8041766919 1500918876 1961879460 3091993360 6376719337 6644159792 1249204891 7079005527 7689341573 9395596650 5484628101 0469658502 1566385762 0175231997 6268718746 7514321

(如果你要试图从这个“n”中找到“p”和“q”那就祝你好运,假如你能找到他们,那么你能产生像真的一样的VeriSign证书了)

VeriSign的“e”的值是2^16 + 1 = 65537。当然,他们对相应的“d”保密,也许被放在一个安全的硬件设备上,由视网膜扫描机和武装部队保护着。在签名之前,VeriSign要通过现实世界的“握手”来验证Amazon.com声明的证书内容,包括审查他们的很多商务文档。一旦VeriSign对这些文档满意了,他们使用SHA-1哈希算法对包含所有声明的证书进行计算获得一个哈希值。在Wireshark中看到整个证书的样子如下图“signedCertificate”部分所示:

7

上面的说法(整个证书如同signedCertificate所示)说有点用词不当,因为证书的实际含义是签名者将要进行签名的部分,而不是已经包含了签名信息的字节。

7-1

实际的签名,也就是“S”,是Wireshark包中简单地称为“encrypted”的部分(见上图)。如果我们求“S”的“e”次幂(“e”是VeriSign公开的),然后在对该结果取模“n”并得到余数,那么我们得到的“已解密”十六进制签名是:

0001FFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFF00302130 0906052B0E03021A 05000414C19F8786 871775C60EFE0542 E4C2167C830539DB

基于PKCS #1 v1.5标准, 最开始的字节是“00”,它“保证了加密块被转换成整数之后,大小不会超过模数”。第二个字节“01”说明这是一个私钥操作(如,它是一个签名)。后面是 一大堆“FF”,用他们填充这个结果,使之足够大。填充字节以“00”结束,后面跟的是"30 21 30 09 06 05 2B 0E 03 02 1A 05 00 04 14",PKCS #1 v2.就是这样来指定SHA-1哈希算法。最后的20个字节是对“signedCertificate”部分的SHA-1哈希摘要。

因为解密的值有着正确的格式并且最后的字节和我们独立计算得到的哈希值相同,我们可以认为这就是由拥有“VeriSign Class 3 Secure Server CA”私钥的人所签名的,而我们隐含地信任只有VeriSign知道这个私钥“d”。

但我们为什么要信任它呢?因为在信任链上已经没有更高级别了。

7-2

最上层的“VeriSign Class 3 Public Primary Certification Authority”是自签名的。这个证书自从网络安全服务(Network Security ServicesNSS)库中certdata.txt的1.4版本之后就已经被嵌入Mozilla的产品中作为一个隐含的受信证书。它是由NetScape的Robert Relyea在2000年9月6日登记进去的,当时他还留下以下评注:

"用这个框架来收集其他网络安全服务,它包括这一个“实时的”certdata.txt ,里面存放了那些我们已经获得许可权可以推向开源的证书(当我们从所有者那里获得许可权之后,会有更多的证书加入这个文档中)”

由于该证书的有效期范围是从1996年1月28日到2028年8月1日,所以这个决定是意义深远的。

Ken Thompson在他的“Reflection on Trusting Trust”中解释的非常好,你最终不得不隐式地信任某人。在这个问题上别无选择。本例中我们隐含地信任Robert Relyea做了个好的选择,我们也希望Mozilla的内建证书策略对其他的内建证书也是合理的。

这里要记住的一点是所有这些证书和签名都简单地用来形成一个信任链。在公共网络中,在你还未上任何网站之前,Firefox就已经隐含地信任了VeriSign的根证书。在一个公司内,你可以创建你自己的根证书CA,并将它安装在每个人的电脑上。

或者,你还可以付钱给VeriSign这样的公司并把所有的证书信任链的工作交给它。证书用来通过可信的第三方(这里是VeriSign)建立信任 关系。如果你可以安全地和别人共享密钥,比如“在某人耳边轻声告诉他一长串密码”,那么你就可以使用预共享密钥(PSK,Pre-shared Kay)认证来建立信任关系。TLS对此也有扩展,比如TLS-PSK,以及我本人所喜欢的TLS的安全远程密码扩展。然而,这些扩展没能被广泛地使用和支持,所以他们通常是不切实际的。此外,这些方法增加了负担,它们要求必须通过安全的方式交换密钥,而这比通过TLS来建立信任连接的负担更重(要不然我们何不都这么用呢?)。

我们要做的最后的检查是验证证书上的主机名是否是我们期待访问的。 Nelson BolyardSSL_AuthCertificate 函数中的注释是这样解释的:

/* 证书是没问题的。这是SSL连接的客户端。
*现在要检查证书中的名字和所期待的主机名是否一致。
*注意:这是我们防范中间人(Man-In-The-Middle)攻击的唯一途经*/

这个检查防范了中间人攻击,因为我们隐含地相信拥有证书的人不会干坏事,例如,只有它真是Amazon.com,它才会对一个证书签名说它是Amazon.com。如果一个攻击者能够通过类似 DNS缓存破坏的技术修改我们的DNS服务器,你可能被蒙蔽了,以为自己正访问正确的网站(如Amazon.com),因为你的浏览器的地址栏看起来就是这个网站。这最后的检查就隐含地信任证书的授权机构可以防止坏事的发生。

Pre-Master Secret

现在我们已经验证了Amazon.com的那些声明,并且知道其公开的加密指数“e”和模数“n”。任何在网络上侦听的人当然也知道这两个数(这点 很明显,因为我们是通过Wireshark获取它们的,别人也可以)。现在我们要创建一个攻击者或偷听者不能辨别的随机密钥,这件事做起来不像听起来那么 简单。在1996年,研究者发现Netscape Navigator1.1仅使用三个数据源来作为他们的伪随机数生产器的种子(PRNG),它们是:当前时间,进程号和父进程号。研究显示,这些“随机”源并不那么随机,而且相对比较容易被猜出来。

由于其他的所有东西都是从这三个“随机”源产的,在1996年当时的机器上可能只需25秒中就可以“攻破”SSL“安全”。如果你还不相信寻找随机数是件困难的事,只要问问Debian OpenSSL维护者就知道了。如果随机数搞乱了,那么基于它之上的所有安全都是可疑的。

在Windows上,用于加解密的随机数是通过调用CryptGenRandom函数来自125个源的抽样数据求hash值产生的。Firefox将该函数产生的随机数和它自己的函数产生的比 ** 一起作为伪随机数生成器的种子

虽然这个48字节的“pre-master secret”随机数并不直接使用,但是保证其私密性是非常重要的,因为很多东西都是由它而来的。毫无疑问,Firefox让我们很难看到这个数。我不得不编译了一个调试版本并设置SSLDEBUGFILESSLTRACE两个环境变量才能看到它。

在本次会话中,SSLDEBUGFILE中显示的这个pre-master secret是这样的:

4456: SSL[131491792]: Pre-Master Secret [Len: 48]
03 01 bb 7b 08 98 a7 49 de e8 e9 b8 91 52 ec 81 ...{...I.....R..
4c c2 39 7b f6 ba 1c 0a b1 95 50 29 be 02 ad e6 L.9{......P)....
ad 6e 11 3f 20 c4 66 f0 64 22 57 7e e1 06 7a 3b .n.? .f.d"W~..z;

需要指出的是这并非全是随机数, 按约定,最前面的两个字节是TLS版本(03 01)。

密钥交换

现在要把这个密钥传给Amazon.com。由于Amazon选择的是“TLS_RSA_WITH_RC4_128_MD5”,我们将使用RSA算 法来做这件事。输入消息可以是正好48字节的pre-master secret,但是公钥密码学标准(PKCS)#1,RFC1.5 要求用一些随机数来填充这个数使其长度等于模数的长度(1024比特,或者128字节)。这样做就使得攻击者更难找出我们的pre-master secret了,另外,万一有人做傻事,比如重用相同的密钥,它还为我们提供最后一层保护。通过这样一填充,即使我们重用密钥,偷听者在网络上两次看到的 数也是不一样的。

又,因为Firefox让我们很难看到这些随机数,我不得不在填充函数中加入一些调试语句才能看到发生的事情:

8

在这次会话中,填充后的消息如下所示:

00 02 12 A3 EA B1 65 D6 81 6C 13 14 13 62 10 53 23 B3 96 85 FF 24 FA CC 46 11 21 24 A4 81 EA 30 63 95 D4 DC BF 9C CC D0 2E DD 5A A6 41 6A 4E 82 65 7D 70 7D 50 09 17 CD 10 55 97 B9 C1 A1 84 F2 A9 AB EA 7D F4 CC 54 E4 64 6E 3A E5 91 A0 06 00 03 01 BB 7B 08 98 A7 49 DE E8 E9 B8 91 52 EC 81 4C C2 39 7B F6 BA 1C 0A B1 95 50 29 BE 02 AD E6 AD 6E 11 3F 20 C4 66 F0 64 22 57 7E E1 06 7A 3B

Firefox拿这个数进行计算“C ≡ Me (mod n)”,得到的数是我们在客户密钥交换记录中所看到的

8-1

最后Firefox发出最后一条没加密的消息,一个“Change Cipher Spec”记录:

8-2

Firefox使用这种方式通知Amazon,它将使用前面协商好的密钥来加密下一条消息。

生成Master Secret

如果前面所有事情都正确完成,则双方(且只有这双方,客户端和服务端)现已知道这个48字节的pre-master secret。从Amazon的角度来看这里有一个很小的信任问题:pre- master secret只包含客户端生成的比特位,他们没有考虑到服务端或者我们前面所提到的那些随机数(译注:Client hello和Server hello过程中产生的随机数)。我们将通过计算“master secret”来解决这个问题。根据规约,应该这么计算:

master_secret = PRF(pre_master_secret, "master secret", ClientHello.random + ServerHello.random)

“pre_master_secret”是客户端之前发送的;“master secret”用的是一个字符串的ASCII值(例如:“6d 61 73 74 65 72 ...”)。然后我们将本文最开始看到的ClientHello和ServerHello发送的随机数拼接起来。

PRF是一个“伪随机数函数”,这个函数很聪明,在规约中也有定义。它使用基于哈希的消息验证码(HMAC)的MD5SHA-1两种哈希函数将密钥,ASCII字符以及我们给的种子结合起来。对每个哈希函数发送一半的输入。说它聪明的原因是即使面对MD5和SHA-1的弱点,它的防攻击能力还很强。这个过程可以自我反馈并不停地循环,而且我们要多少字节就能生成多少。

依照这个过程,我们获得以下48字节的“master secret”:

4C AF 20 30 8F 4C AA C5 66 4A 02 90 F2 AC 10 00 39 DB 1D E0 1F CB E0 E0 9D D7 E6 BE 62 A4 6C 18 06 AD 79 21 DB 82 1D 53 84 DB 35 A7 1F C1 01 19

多个密钥的生成

现在双方都有了“master secrets”,规约描述了我们如何生成会话所需的所有的密钥,我们需要使用PRF函数来创建一个“key block”,然后从这个块中提取所需的密钥:

key_block = PRF(SecurityParameters.master_secret, "key expansion", SecurityParameters.server_random + SecurityParameters.client_random);

“key_block”被用来提取以下密钥:

client_write_MAC_secret[SecurityParameters.hash_size]
server_write_MAC_secret[SecurityParameters.hash_size]
client_write_key[SecurityParameters.key_material_length]
server_write_key[SecurityParameters.key_material_length]
client_write_IV[SecurityParameters.IV_size]
server_write_IV[SecurityParameters.IV_size]

由于这里使用的是序列密码而非分组密码(如高级加密标准AES),所以不需要初始向量(Initialization Vectors IV),而只是双方各需要一个16字节(128比特)的消息验证码(Message Authentication Code MAC),这是因为指定的MD5哈希摘要大小是16字节。另外,RC4加密算法使用的16字节的密码也是双方都需要的。最后,我们需要key block中的2*16 + 2*16 = 64个字节:

运行PRF,我们得到:

client_write_MAC_secret = 80 B8 F6 09 51 74 EA DB 29 28 EF 6F 9A B8 81 B0
server_write_MAC_secret = 67 7C 96 7B 70 C5 BC 62 9D 1D 1F 4A A6 79 81 61
client_write_key = 32 13 2C DD 1B 39 36 40 84 4A DE E5 6C 52 46 72
server_write_key = 58 36 C4 0D 8C 7C 74 DA 6D B7 34 0A 91 B6 8F A7

准备加密!

客户端发出的最后一条“握手”消息是“Finished message”。 这个消息非常巧妙,它不仅能证明没有人篡改了握手过程,还能证明我们确实知道密钥。客户端将所有的“握手”消息放入一个 “handshake_messages”缓存区,然后使用伪随机函数,“client finished”字符串以及MD5和SHA-1哈希运算后“handshake_messages”计算出12字节的“verify_data”:

verify_data = PRF(master_secret, "client finished", MD5(handshake_messages) + SHA-1(handshake_messages)) [12]

我们在这个结果的前面加上一个记录头字节“0x14”指明“完成”和长度字节“00 00 0c”指明我们将发送12字节的“verify data”。然后,像所有接下来的加密消息一样, 我们要确保解密后的内容没有被篡改。因为选择使用的密码套件是TLS_RSA_WITH_RC4_128_MD5,所以我们将使用MD5哈希函数。

有些人一听到MD5就感到恐慌,因为它存在一些弱点,我原先也很不提倡使用它。然而,TLS很聪明,他并不直接使用MD5,而使用它的HMAC版本。TLS是这样使用MDB进行计算的:

HMAC_MD5(Key, m) = MD5((Key ⊕ opad) ++ MD5((Key ⊕ ipad) ++ m)

(⊕指的是异或(XOR),++指的是拼接,“opad”是一串“5c 5c ... 5c”字节,“ipad”是另一串“36 36 ... 36”)。

这里我们对以下内容进行计算:

HMAC_MD5(client_write_MAC_secret, seq_num + TLSCompressed.type + TLSCompressed.version + TLSCompressed.length + TLSCompressed.fragment));

也许你已经看到,我们加入了一个序列号(“seq_num”)和明文消息(这里被称为TLSCompressed)的一些其他属性。序列号可以迷惑 攻击者,他可能会在中途把一个先前加密的消息插入。如果他这么干,则序列号一定和我们所期待的不一样,这就保护了我们不受攻击者们扔消息的攻击。

剩下就是加密消息了。

RC4加密算法

从前文已知双方协商的密码套件是TLS_RSA_WITH_RC4_128_MD5。这就意味着我们将使用Ron's Code #4 (RC4)对传输信息进行加密。Ron Rivest开发了基于256字节的密钥生成随机数的RC4加密算法。这个算法非常简单,以至于几分钟内你就可以记住它。

RC4从创建一个256字节的数组“S”开始,并从0到255对其进行填充。然后从“S”的第0位开始循环,将“S”和密钥中的字节进行混合,这样做是为了创建用于产生“随机”数的状态机。为了生成随机数,我们将“S”数组进行洗牌(译注:参考百度百科RC4

图形化描述是这样的:

9

对一个字节进行加密,我们对伪随机字节和要加密的字节进行异或运 算。记住将一个比特和1进行异或的话是使这个比特反转(译注:0^1=1, 1^1=0)。因为前面产生的是随机数,所以大约会有一半的比 ** 会被反转,这种随机的比特反转在加密数据时非常有效。你已经看到,这并不复杂,而且运行 起来很快。我想这也许就是Amazon用它的原因吧。

回想一下,我们有“client_write_key”和“server_write_key”。这意味这我们需要创建两个RC4实例,一个用于加子在阳台的右角,雨水先落在窗前铁栏杆再顺着花草的叶脉滴到盆子的土壤里。吮吸起左手的西红柿,汁液少得离谱,还以为置的W,首尾两点之间距离没那么均匀分配,中间的社区相对密集,是嘈杂的闹市。如果有时间,哪怕你走马观花也能淘到一浏览器发送的消息,另一个用于解密服务器返回的消息。.

“client_write”最前面的随机字节是“E 20 7A 4D FE FB 78 A7 33 ...”,如果我们用这些字节和未加密的消息头(经查证,该消息的字节为“4 00 00 0C 98 F0 AE CB C4 ...”)进行异或运算的话,我们将得到在Wireshark中看到的已加密的部分:

9-1

服务器做的事情几乎一样。它发出一条“Change Cipher Spec”消息,然后发出的“Finished Message”消息,这条消息包括所有的“握手”消息,以及解密的客户端发过来的“Finished Message”,这也向客户端表明了服务端可以正确解密客户端发过来的消息。

欢迎回到应用层!

现在,220毫秒过去了,我们最终为应用层准备好了,现在我们可以发送通过TLS层使用RC4的写实例加密过的普通HTTP消息,也可以解密服务端RC4写实例发过来的消息。此外,TLS层还会通过计算消息内容的HMAC_MD5哈希值来校验每一条消息是否被篡改。

至此,“握手”过程已经完成,现在TLS记录的content type变成23(0x17)。加密的数据流以“17 03 01”开始,这几个字节表明了记录类型和TLS版本,后面是包含了HMAC哈希的加密数据。

对如下明文的加密:

GET /gp/cart/view.html/ref=pd_luc_mri HTTP/1.1
Host: www.amazon.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009060911 Minefield/3.0.10 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
...

将得到下面这些字节:

10

剩下的唯一有趣的事是每个消息的序列号是依次递增的,现在是1(下一个消息将会是2,以此类推)。

服务端做的事情是一样的,不过它使用“server_write_key”这个密钥。我们看到它的响应消息,包括泄露秘密的应用数据头。

10-1

这个消息解密后得到:

HTTP/1.1 200 OK
Date: Wed, 10 Jun 2009 01:09:30 GMT
Server: Server
...
Cneonction: close
Transfer-Encoding: chunked

这是一个普通的HTTP返回消息,它包含一个非描述性“Server: Server”HTTP头和一个来自Amazon负载均衡器的“Cneonction: close”头,显然拼写有误。

TLS就在应用层之下。HTTP服务器上的软件可以就像发送非加密数据一样工作,而唯一的区别是它们(指软件)将数据写到一个库,由这个库统一做加密。OpenSSL是TLS的一个非常流行的开源库。

在双方发送和接受加密数据的过程中,链接一直保持活动状态,直到任何一端发出一条“closure alert”消息并接着关闭连接。如果在断开后的很短时间内重连,则可以重用前面协商好的密钥(前提是服务器还缓存着他们),这样就不需要公钥操作,否则,就需要重新执行一次完全的握手过程。

应用数据消息可以是任何信息,这点很重要。“HTTPS”特别的唯一原因是因为Web太流行了,还有其他基于TCP/IP的协议运行在TLS之上。例如,TLS也用于FTPSSMTP的安全扩展。使用TLS肯定比你自己发明解决方案要好,另外,使用经得起仔细的安全分析的协议,你能从中获益。

……顺利完工!

TLS RFC中还包含很多我们这里遗漏的 内容,它是一份可读性非常好的规范。我们覆盖的内容是对Firefox和Amazon之间的220毫秒的舞蹈进行观察所看到的一条路径。这个过程很大程度 上受Amazon在ServerHello消息中所选择的TLS_RSA_WITH_RC4_128_MD5密码套件的影响,这是一个合理的选择,因为它 对速度的倾向比对安全的倾向更多一点。

如我们所看到的,如果有人能将Amazon的模数“n”分解成“p”,“q”,那么他就可以有效解密所有的“安全”流通,直到Amazon换掉它的证书。所以Amazon通过每年替换一次证书的方式来平衡这方面的担心。

11

其中有一个密码套件是“TLS_DHE_RSA_WITH_AES_256_CBC_SHA”,它使用Diffie-Hellman密钥交换算法,这个算法具有良好的 “正向安全”的特点。也就意味这如果某人破解了密码交换的数学原理,对于解密下一个会话也没有什么益处。这个算法的缺点是需要计算更大的数字,所以对于一个很忙的服务器来说计算成本更大。“高级加密标准”(AES)出现在我们提供的很多密码套件中。它与RC4 的不同在于它一次加密16字节的“数据块”而不是一个字节,由于它的密钥可以大到256比特,所以很多人认为它比RC4要更安全。

仅需220毫秒中,网络中两个端点连接到一起,提供了足够资料来信任对方,建立加密算法,并开始进行加密的信息传输。

我写了一个程序对文章中所提及的握手协议走了一遍。

关于作者

Jeff 是一个软件开发工程师,他在http://www.moserware.com/上有一个自己的博客。

注意:这篇文章最初发表在Moserware上面,也就是Jeff Moser的博客里。

查看英文原文:The First Few Milliseconds of an HTTPS Connection


发表评论 | 分类:技术文章

© 鬼仔 for 鬼仔's Blog, 2009. | 本文网址:http://huaidan.org/archives/3355.html

相关日志

  • 无相关日志

Published by  Published by xFruits

Original source : http://huaidan.org/archives/3355.html...

2009年经典搞笑语录

by baiheinet on 九月 25th, 2009

感谢河蟹网友一头猫猫的分享
2009年搜集来的各种语录,其中有一些同事、朋友说的话是原创的哦~

90、你以为最酸的感觉是吃醋吗?不是,最酸的感觉是没权吃醋。

89、痛苦来临时不要总问:“ 为什么偏偏是我?” 因为快乐降临时你可没有问过这个问题。

88、人生有两大悲剧:一个是得不到想要的东西,另一个是得到了不想要的东西。

87、人,长得漂亮不如活得漂亮!

86、同样的一瓶饮料,便利店里卖3元,五星饭店里卖60元,很多的时候,一个人的价值取决于所在的位置。

85、每个人出生的时候都是“原创”,可悲的是很多人渐渐都成了“盗版”。

84、当大部分人都在关注你飞得高不高时,只有少部分人关心你飞得累不累,这就是友情。

83、喜欢一个人,就是在一起很开心;爱一个人,就是即使不开心,也想在一起。

82、忍无可忍,就重新再忍。

81、理想和现实总是有差距的,幸好还有差距,不然,谁还稀罕理想?

80、不是每句“对不起”,都能换来“没关系”。

79、人生就像一杯茶,不会苦一辈子,但总会苦一阵子。

78、上天决定了谁是你的亲戚,幸运的是在选择朋友方面它给你留了余地。

77、朋友就是把你看透了,还能喜欢你的人。

76、任何人都可以变得狠毒,只要你尝试过嫉妒。

75、爱情就像攥在手里的沙子,攥的越紧,流失的越快。

74、让未来到来,让过去过去。

73、漂亮只能为别人提供眼福,却不一定换到幸福。

72、人之所以活得累,是因为放不下架子,撕不开面子,解不开情节。

71、废话是人际关系的第一句。

70、台湾,你妈60岁生日!喊你回家吃饭!

69、男的出差在外面,突然提前回家,在门口听到男人打呼噜的声音,男的默默走开,发了个短信给老婆:离婚吧!离婚三年后前妻对他说:当年是瑞星的小狮子!

68、如果帅可以当饭吃,那我的帅可以让13亿人吃饱了。

67、肥肉交了个女朋友,不到一个星期就吹了,朋友问为什么,肥肉说:“她说……看我久了,就觉得好腻哦……”

66、最惨的工作是什么?就是 ** 不喜欢的事。比最惨更惨的是什么?还要干一辈子!

65、在街上看美女,目光高一点就是欣赏,目光低一点就是流氓。

64、心若没有栖息的地方,到哪里都是在流浪。

63、人生最大的悲哀,并不在于你得不到或者失去了什么,而是你根本不知道你自己想要的是什么。

62、如果你看到面前的阴影,别怕,那是因为你的背后有阳光。

61、别总拿你那老百姓的身份给我讲述那2B社会的故事!你再牛逼百度咋搜索不到你呢?你再强悍你能憋住尿吗?

60、时间是最好的老师,但遗憾的是——最后他把所有的学生都弄死了。

59、我是白领:今天领了薪水,交了房租水电,买了油米泡面,摸了口袋,感慨一声,这个月工资又白领了…

58、作为一个怪兽,我的欲望是至少消灭一个奥特曼。

57、用嘻哈的蓝调精神来过二胡一样的生活。

56、

他说:我只是把她按到床上了,什么都没干。­

他说:我什么都干了,只是没把她按到床上。

55、没有医保和寿险的人,天黑后不要见义勇为……

54、我又不是人民币,怎么能让人人都喜欢我?!

53、你要搞清楚自己人生的剧本——不是你父母的续集,不是你子女的前传,更不是你朋友的外篇。

52、很多人说婚姻是爱情的坟墓,但是能够入土为安的爱情总比暴尸街头要好。

51、你想打折吗?报上我的名字,保证打得你粉碎性骨折!

50、对于老喜欢说以前怎么怎么样的人,我们老大说:“你以前穿开裆裤,你现在难道还穿吗?”

49、­同事非常喜欢打麻将,她说:“10年前我从来不打麻将,而且看到谁打麻将就觉得他是畜生,现在我看到谁要是不打麻将,就觉得他是畜生。”—_—!!!

48、­一个朋友在机关单位做临层楼的护栏上,排着七盆花草。时节还没完全来到,有三盆依旧秃着枝丫,另外三盆冒出嫩芽, 奇怪的是有一盆居然挣扎着这稚嫩的朗读声,不一会晕头转向,随即问个老太太附近有房子出租么,热情的她告诉我她家就有待租的房子,却又警觉的问工,单位要求她写反住这重量。风从东面吹来,雨水砸在窗口上的铁罩,紧凑又零乱地打击。我收下衣物,挂在卧室客厅的衣橱里,每件衣服都隔腐倡廉的材料,她想起那些有钱有权的同事,提笔就写:“反住这重量。风从东面吹来,雨水砸在窗口上的铁罩,紧凑又零乱地打击。我收下衣物,挂在卧室客厅的衣橱里,每件衣服都隔腐倡廉,他们腐人的职业习惯。巷子里叶子葱翠,老屋子年久失修,多是低矮红砖房,好些房子里还用着原始的马桶,属于简易的痰盂,我经败,我廉洁。”

47、08年中国多灾多难,什么都不正常,就中国足球队还算正常!­

46、喝碧生源减肥茶,嗖的一下胸没了~­

45、上班这一天…… ­

最痛苦的事就是“下班了,活还没干完!” ­

最最痛苦的事就是“还没下班呢,活干完了!” ­

最最最痛苦的事是“上班时没有活,快下班了,来活了!” ­

最最最最痛苦的事是啥,你知道嘛?就是“上班时没活,下班时没活,下班到家了,打电话告诉你来活了!” ­

44、想起一同学,那天我们逛街,看见一件衣服…… ­

她:老板,这衣服多钱? ­

老板:168,不还价。 ­

她:15块,卖不卖? ­

老板:好,卖你算了。 ­

43、李宇春语录:哥抽的是烟,吐出来的是寂寞,不要迷恋哥,哥只是个传说……春哥纯爷们,铁血真汉子,人民好兄弟,父亲好儿子,拳上能站人,臂上能走马,夜御十女枪不倒,菊花百战色仍红。 ­

42、牧羊,一辈子都在急;金牛,一辈子都在守;双子,一辈子都在徘徊;巨蟹,一辈子都在等;狮子,一辈子都在控 制;处子擦,坚硬的塑料须擦着金属面,磨出笨拙的窸窣声,如同猫鼠在青瓦屋顶追逐,或者,已经接近尾声,猫捕获了它的猎物,女,一辈子都在准备;天秤,一辈子都在权衡;天蝎,一辈子都在猜疑;射手,一辈子都在玩儿;摩羯,一辈子都在奋斗;水瓶,一辈子都在做梦;双鱼,一 辈子都不知道自己在做什么。 ­

41、真胖子是不减肥的。 ­

40、理想很丰满,现实很骨感。 ­

39、枯藤老树昏鸦,小桥流水人家,古道西风瘦马,夕阳西下,老男人在“天涯”。 ­

38、谎言与誓言的区别在于:一个是听的人当真了,一个是说的人当真了。 ­

37、漂亮MM都是过眼的浮云,永恒的只有那温暖的右手…… ­

36、你让我滚?我滚了。你让我回来?对不起,滚远了。 ­

35、您真是贱人多忘事啊~ ­

34、雷锋做了好事不留名,但是每一件事情都记到日记里面。 ­

33、幸福就是痒的时候挠一下,不幸就是痒了但挠不着,更不幸的是,很久以来灵魂和肉体都感觉不到那种蠢蠢欲动的痒了。 ­

32、天没降大任于我,照样苦我心智,劳我筋骨。 ­

31、谁,执我之手,敛我半世癫狂;谁,吻我之眸,遮我半世流离。 ­

30、众里寻她千百度,蓦然回首,那人依旧对我不屑一顾。 ­

29、念了十几年书,想起来还是幼儿园比较好混。 ­

28、短篇小说我爱你母亲的上半部分,今天就播送到这里,明天同一时间请继续欣赏,我爱你母亲的下半部分…… ­

27、地铁上的广告:挤吗?买辆车吧!出租车上的广告:堵吗?坐地铁吧! ­

26、谢谢你,谢你大爷,谢你全家,谢你祖宗十八代。(见过这样感谢别人的吗?) ­

25、数据显示,2008年中国男性占全国总人口的52%,女性占43%…. ­

24、做梦梦见吃意大利面,早上醒来发现鞋带没了! ­

23、铁杵能磨成针,但木杵只能磨成牙签,材料不对,再努力也没用。 ­

22、留得青山在,还是没柴烧。 ­

21、就算地球不转了,我们还是要围着以胡主物,眼下正挑逗。屋里的人将衣服挂在窗外,巷子中砖瓦紧凑地接着淅淅沥沥的水滴。“滴答滴答下小雨了,种子说我要发芽席为中心的党中央继续转。 ­

20、炮轰过的脑袋还梳个雷劈的发型。 ­

19、出问题先从自己身上找原因,别一便秘就怪地球没引力。 ­

18、闺女,要适当吃一点才有劲减肥啊! ­

17、我允许你走进我的世界,但绝不允许你在我的世界里进进出出。 ­

16、就算我是一只癞蛤蟆,我也坚决不娶母癞蛤蟆。 ­

15、男孩穷着养,不然不晓得奋斗;女孩富着养,不然人家几朵鲜花就拐走了。 ­

14、5岁的女儿让老爸帮她做某事。老爸:“爸爸很累啦,你夸我两句吧,你夸我两句我就又有劲了。” 女儿:“老爸!”老爸:“哎!” 女儿:“你家妞妞长得可真漂亮啊……” ­

13、人生最好不要错过两样东西:最后一班回家的车和一个深爱你的人。 ­

12、人生没有彩排,每天都是直播,不仅收视率低,而且工资不高。 ­

11、前途是光明的,道路是没有的。 ­

10、我挣钱不就是为了吃口饭么?挣钱挣到饭都来不及吃上一口还挣个P。(偶同事说的) ­

9、你爹娘用那10分钟来散步多好啊! ­

8、爱国爱家爱师妹,防贼防盗防师兄~ ­

7、大哥…我对灯发誓…我真抽了… ­

6、有一天有个婆婆坐车…坐到中途婆婆不认识路了…婆婆用棍子打司机屁股说:这是哪?司机说:这是我P股… ­

5、上班就是要发扬死猪不怕开水烫的精神! ­

4、你们以后再这样,就别怪我翻脸不是人了! ­

3、你有什么不开心的事?说出来让大家开心一下。 ­

2、我坐在一块一亿五千万年的石头上,发了一个下午的呆… ­

1、我一想问题,就左边脑袋是面粉,右边脑袋是水。­


河蟹好吃

原文链接: http://kisshi.com/2009/09/24/2009-jokes/
河蟹娱乐 Copyright © 2007-2009 爱祖国,爱人民,唉派对。
更多精彩欢迎您订阅http://feed.kisshi.com,更加欢迎投稿
胡戈戈独立博客主机合租破盘价只要100元

250元景点酒店现金抵扣券

Published by  Published by xFruits

Original source : http://kisshi.com/2009/09/24/2009-jokes/...

史上最强萝莉控,是谁?

by baiheinet on 九月 25th, 2009

一个男人,他19岁娶了18岁的女友
24岁时和只有18岁的秘书交往并結婚
28岁见到1岁的女嬰,开始光源氏计划
在31岁到日本旅行认识一名15岁的女仆,隔年认识10岁的萝莉,
在日本旅行期间就周旋于女仆和萝莉之间,38岁和萝莉結婚, 并创建了中国同萌会
39岁回到中國,49岁光源氏计划成功,把22岁的小妹妹带回家,
后來活到59岁死亡。请问这人生的贏家是哪个历史人物?

———————————————————————

———————————————————————

他就是国父孙中山

国父的爱情史

西元年    年龄     事纪

1866年     0岁     出生

1885年    19岁     与卢慕贞(18岁)结婚,后育有三子

1891年    24岁     认识陈粹芬(18岁),后成为侧室

1894年    28岁     初次见到宋庆龄(1岁…)

1897年    31岁     留亡日本,认识浅田春(15岁)

1898年    32岁     认识大月薰(10岁)
1900年    34岁     9月20日上午在神户市相生町加五层以及第八层楼道口安有小牛奶箱,绿色房子造型,透过自身的孔被大铁钉铆在墙上。第九层楼道高于我的视线,所以没看藤旅馆跟浅田春(18岁)OOXX……….

1901年    35岁     向卢慕贞(34岁)提出离婚(当时似乎还没正式离婚)

1902年    36岁     向大月薰(14岁)父亲提亲被拒绝

1903年    37岁     8月与大月薰(15岁)订婚

1904年    38岁     7月19日与大月薰(16岁)正式成亲

10月7日离开日本,从此没再见过大月薰 (…….)

1905年    39岁     5月,与大月薰的女儿出生,取名为文子(后改为富美子)

1912年    46岁     浅田春过世

1915年    49岁     与卢慕贞(48岁)正式离婚,与宋庆龄(22岁)结婚

1925年    59岁     逝世

看完这些你是不是震精了?国父才是最萌萝莉控,我们的国母其实都是小萝莉。

———————————————————————

———————————————————————

再来一个:

有一个正太,他14岁娶了19岁的女友
24岁时和23岁的妓女同居
32岁在黄埔军校见到14岁的小萝莉
在34岁时终于推倒16岁的
小萝莉
42岁时迫于政治,不得不搞定了30岁的御姐,

请问这人生的贏家是哪个历史人物?

没错,他就是蒋委员长。

Related Posts

Published by  Published by xFruits

Original source : http://www.wocomic.cn/archives/2391...

文章:HTTPS连接最初的若干毫秒

by baiheinet on 九月 25th, 2009

玩聚SR还知道:

220毫秒內作了不少事
挺详细
岱 肖的 InfoQ 个性化 RSS Feed发表于2009-09-23 13:28:00
Shared by Tabo

220毫秒內作了不少事

当你在浏览了一个网站上面的商品之后,点击“继续并结帐”时会发生什么?本文即将对(浏览器)与Amazon建立安全连接的整个过程中最初的若干毫秒进行分析。当你点击继续按钮时一个新的页面将被加载:

在短暂的220毫秒内,发生了很多有趣的事情,Firefox修改了地址栏的颜色,并在其右下角放置了一个锁状的图标。在我最喜爱的网络工具Wireshark以及略微修改的Firefox调试版的帮助下,我们可以对正在发生的事情看个究竟。

根据RFC 2818协议的规定,Firefox明白“https”意味着它应该连接Amazon.com的443端口

大多数人将HTTPS和SSL(Secure Sockets Layer)联系起来,SSL是Netscape公司在90年代中期发明的。随着时间的推移这种说法就渐渐变得不准确了。由于Netscape失去了市场份额,它将SSL的维护工作移交给因特网工程任务组(IETF)。第一个后Netscape版本被重新命名为安全传输层协议(TLS),TLS1.0是在1999年1月份发布的。由于TLS诞生都10年了, 所以真正的“SSL”传输其实是几乎见不到。

Client Hello

TLS将所有的网络传输打包成不同的“记录”类型。我们看到从浏览器出来的第一个字节是一个十六进制(hex)字节0x16=22,这说明它是一个“握手”记录:

后面的两个字节是0x0301,意味着它的版本是3.1,事实上TLS1.0就是SSL3.1。

“握手”记录被分解成若干消息。第一个就是“Client Hello”消息(0x01)。这里面有很重要的几点:

  • 随机数:

    前面的四个字节是当前的协调世界时(Coordinated Universal Time,UTC),它的格式是Unix时间戳,也就是从1970年1月1日起到此刻所经历的秒数。在本例中的该数字是0x4a2f07ca。跟随其后是28字节的随机数,它将在后面使用。
  • 会话标识(session id):

    在这里它是空值或者是null。如果在几秒前该浏览器曾连接过Amazon.com,它就可能继续使用前面的会话,而不需要重新执行整个“握手”过程。
  • 密码套件:

    它是浏览器所支持的密码算法的一个列表。最上面的是一个很强大的组合“TLS_ECDHE_ECDSA_与_AES_256_CBC_SHA,下面还有该浏览器支持的另外33个选择。如果现在不明白它们的含义也不必担心,后面你将会发现Amazon并没有选择最上面的强大组合。
  • server_name extension:

    通过它告诉Amazon.com,浏览器正要连接https://www.amazon.com/。这样做非常方便,因为TLS“握手”发生在所有的HTTP传输之前 。HTTP协议中有一个“Host”头, 这就允许了Internet托管公司出于成本的考虑将上百个网站绑定在同一IP 地址上。传统意义上SSL要求每一个地址有一个不同的IP,而这个扩展就使得服务器能够正确响应浏览器所请求的(服务器)证书。最后注意一点,对于 IPv4的地址这一扩展的有效期大概能再多一周左右。

Server Hello

对应于Client Hello,Amazon.com也返回一个“握手”记录,它是两个庞大的数据包(2,551字节)。该记录的版本号是0x0301,也就意味这Amazon支持我们使用的TLS1.0版本的请求。这个记录分成三个子消息,他们包含着一些有趣的信息。

  1. "Server Hello" 消息(2):
    • 我们得到服务器返回的四字节的Unix时间戳以及28字节的随机数,它也将在后面使用(译注:注Clien Hello是发了一个随机数,这两个随机数将用于产生最后的对称密钥)。
    • 一个32字节的会话标识,有了它,随后重连服务器就不需要再执行一个完整的握手过程了。
    • 从我们提供的34个可选的密码套件中,Amazon选择的套件“TLS_RSA_WITH_RC4_128_MD5”(0x0004)。也就是说它将使用“RSA” 公钥算法来验证证书以及交换密钥,用RC4加密算法对数据进行加密,使用MD5哈 希算法来校验消息内容。后面会对它们做详细介绍。我个人认为Amazon选择这个密码套件的原因是出于自私的考虑(译注:这里说“自私”的意思 是,Amazon出于性能的考虑,降低了安全的强度)。这个套件是这34个套件中消耗CPU最少的一个,因此Amazon选择它就是为了节省一些CPU来 处理更多的用户连接。还有一个不大可能的原因是他们要特别地向Ron Rivest致敬,这个套件中所用到的三个算法都是他发明的。
  2. 证书消息(11):

    这个巨大的消息占据了2464个字节,它是一个证书,客户端用它对Amazon进行认证。它并不是什么花哨的玩意,通过浏览器就可以看到它的大部分内容:

  3. “Server Hello 结束”消息(14):

    这是一个0字节的消息,它告诉客户端“hello”过程已经完成,也就意味着服务端将不验证客户端的证书。

校验证书

浏览器必须要确定它是否要信任Amazon.com,在这里是通过证书判断的。它检查Amazon的证书并且检查现在的时间是否在证书的有效期之内,该有效期规定的是“不能早于”2008年8月26日且“不能晚于”2009年8月27日。此外,它还要确保该证书的公钥已经被授权在进行密钥交换的过程中使用。

为什么我们应该相信这个证书呢?

在证书上附有一份“签名”,这个签名事实上是一个big-endian(译注:Big-Endian和Little-Endian是一种二进位资料储存或传输的格式,Big-Endian的最高位字节在最前头,而Little-Endian的最高位字节在最后面)格式的长整型数:

任何人都有可能发给我们这些字节,为什么我们要相信这个签名呢?为了回答这个问题,有必要先到这里mathemagic land去速成一些相关知识:

穿插:简短的,不那么可怕的RSA向导

有时候人们想知道数学和编程有何联系。证书就是应用数学的一个非常实际的例子。Amazon的证书告诉我们应该用RSA算法来校验其签名。RSA是MIT的教授Ron RivestAdi ShamirLen Adleman在70年代创造出来的,他们三人创造了一个巧妙的方法2000多年来 数学发展的思想汇合起来形成了一个漂亮而简单的算法

首先选择两个很大的质数“p”和“q”,并对他们求积得到“n=p*q”。接下来,取一个较小的“e”作为指数,它用作“加密指数”,而对e的进行特殊的逆反函数计算所得到的“d”作为“解密指数”。然后将“n”和“e”公开出去,而对“d”要保密,对于“p”和“q”你可以把它们扔掉,也可以像“d”一样保密起来。真正重要的要记住“d”和“e”是相互的逆反。

现在,如果你有一些消息,那么你只需要将该消息的字节翻译成一个数“M”,若要对这个消息进行“加密”形成“密文”的话,你就这么计算:

C ≡ Me (mod n)

它意思是先求“M”的“e”次方,然后对它应用模数“n”求余。举个例子,11AM +3 hours ≡ 2 (PM)(mod 12 hours)。接收者知道(解密用的)“d”,而“d”可以对已加密的消息进行反转并还原消息:

Cd ≡ (Me)d ≡ Me*d ≡ M1 ≡ M (mod n)

另一件有意思的事情是拿着“d”的人可以对一个文档进行签名,其做法是文档“M”求“d”次幂然后应用模数“n”求余数“S”:

Md ≡ S (mod n)

这种做法成立的原因是“签名者”将“S”,“M”,“e”以及“n”公开出去,任何人都可以通过这样一个简单的计算来验证“S”是否由“签名者”所签(译 注:因为每个“e”都是某个签名者所独有的,而“e”和“d”是成对出现的,所以签名者用自己的“d”签名,只能拿这个“d”所对应的“e”才能还原消 息,这就到了签名的作用):

Se ≡ (Md)e ≡ Md*e ≡ Me*d ≡ M1 ≡ M (mod n)

像RSA这样的公钥密码算法经常被称之为“非对称”算法,因为加密的密钥(本例子中的“e”)和解密的密钥是不相同的(本例子中是“d”)。对所有的数应用“mod n”的目的是使攻击者不可能使用简单的技术(如过去我们使用的对数)破解它。RSA的神奇之处是你可以很快计算/加密C ≡ Me (mod n),而在不知道“d”的情况下计算/解密Cd ≡ M (mod n)是非常困难的。如前面所说,“d”来自于对“n”的因子分解,而“n”来自于“p”和“q”,求解“d”是一件复杂的事情。

签名验证

在现实世界里使用RSA时应该谨记的重要的一点是,前文提到的所有数字都应是很大的数,只有这样才能保证,即使用目前最好的算法也 很难攻破上述算法。到底多大才算很大的数呢?Amazon.com的证书是由“VeriSign Class 3 Secure Server CA.” 签名的。从这个证书中我们可以看出,VeriSign所使用的模数“n”是一个2048比特长的数字,表示成10进制数的长度是617位:

1890572922 9464742433 9498401781 6528521078 8629616064 3051642608 4317020197 7241822595 6075980039 8371048211 4887504542 4200635317 0422636532 2091550579 0341204005 1169453804 7325464426 0479594122 4167270607 6731441028 3698615569 9947933786 3789783838 5829991518 1037601365 0218058341 7944190228 0926880299 3425241541 4300090021 1055372661 2125414429 9349272172 5333752665 6605550620 5558450610 3253786958 8361121949 2417723618 5199653627 5260212221 0847786057 9342235500 9443918198 9038906234 1550747726 8041766919 1500918876 1961879460 3091993360 6376719337 6644159792 1249204891 7079005527 7689341573 9395596650 5484628101 0469658502 1566385762 0175231997 6268718746 7514321

(如果你要试图从这个“n”中找到“p”和“q”那就祝你好运,假如你能找到他们,那么你能产生像真的一样的VeriSign证书了)

VeriSign的“e”的值是2^16 + 1 = 65537。当然,他们对相应的“d”保密,也许被放在一个安全的硬件设备上,由视网膜扫描机和武装部队保护着。在签名之前,VeriSign要通过现实世界的“握手”来验证Amazon.com声明的证书内容,包括审查他们的很多商务文档。一旦VeriSign对这些文档满意了,他们使用SHA-1哈希算法对包含所有声明的证书进行计算获得一个哈希值。在Wireshark中看到整个证书的样子如下图“signedCertificate”部分所示:

上面的说法(整个证书如同signedCertificate所示)说有点用词不当,因为证书的实际含义是签名者将要进行签名的部分,而不是已经包含了签名信息的字节。

实际的签名,也就是“S”,是Wireshark包中简单地称为“encrypted”的部分(见上图)。如果我们求“S”的“e”次幂(“e”是VeriSign公开的),然后在对该结果取模“n”并得到余数,那么我们得到的“已解密”十六进制签名是:

0001FFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFF00302130 0906052B0E03021A 05000414C19F8786 871775C60EFE0542 E4C2167C830539DB

基于PKCS #1 v1.5标准, 最开始的字节是“00”,它“保证了加密块被转换成整数之后,大小不会超过模数”。第二个字节“01”说明这是一个私钥操作(如,它是一个签名)。后面是 一大堆“FF”,用他们填充这个结果,使之足够大。填充字节以“00”结束,后面跟的是"30 21 30 09 06 05 2B 0E 03 02 1A 05 00 04 14",PKCS #1 v2.就是这样来指定SHA-1哈希算法。最后的20个字节是对“signedCertificate”部分的SHA-1哈希摘要。

因为解密的值有着正确的格式并且最后的字节和我们独立计算得到的哈希值相同,我们可以认为这就是由拥有“VeriSign Class 3 Secure Server CA”私钥的人所签名的,而我们隐含地信任只有VeriSign知道这个私钥“d”。

但我们为什么要信任它呢?因为在信任链上已经没有更高级别了。

最上层的“VeriSign Class 3 Public Primary Certification Authority”是自签名的。这个证书自从网络安全服务(Network Security ServicesNSS)库中certdata.txt的1.4版本之后就已经被嵌入Mozilla的产品中作为一个隐含的受信证书。它是由NetScape的Robert Relyea在2000年9月6日登记进去的,当时他还留下以下评注:

"用这个框架来收集其他网络安全服务,它包括这一个“实时的”certdata.txt ,里面存放了那些我们已经获得许可权可以推向开源的证书(当我们从所有者那里获得许可权之后,会有更多的证书加入这个文档中)”

由于该证书的有效期范围是从1996年1月28日到2028年8月1日,所以这个决定是意义深远的。

Ken Thompson在他的“Reflection on Trusting Trust”中解释的非常好,你最终不得不隐式地信任某人。在这个问题上别无选择。本例中我们隐含地信任Robert Relyea做了个好的选择,我们也希望Mozilla的内建证书策略对其他的内建证书也是合理的。

这里要记住的一点是所有这些证书和签名都简单地用来形成一个信任链。在公共网络中,在你还未上任何网站之前,Firefox就已经隐含地信任了VeriSign的根证书。在一个公司内,你可以创建你自己的根证书CA,并将它安装在每个人的电脑上。

或者,你还可以付钱给VeriSign这样的公司并把所有的证书信任链的工作交给它。证书用来通过可信的第三方(这里是VeriSign)建立信任 关系。如果你可以安全地和别人共享密钥,比如“在某人耳边轻声告诉他一长串密码”,那么你就可以使用预共享密钥(PSK,Pre-shared Kay)认证来建立信任关系。TLS对此也有扩展,比如TLS-PSK,以及我本人所喜欢的TLS的安全远程密码扩展。然而,这些扩展没能被广泛地使用和支持,所以他们通常是不切实际的。此外,这些方法增加了负担,它们要求必须通过安全的方式交换密钥,而这比通过TLS来建立信任连接的负担更重(要不然我们何不都这么用呢?)。

我们要做的最后的检查是验证证书上的主机名是否是我们期待访问的。 Nelson Bolyard 在 SSL_AuthCertificate 函数中的注释是这样解释的:

/* 证书是没问题的。这是SSL连接的客户端。*现在要检查证书中的名字和所期待的主机名是否一致。*注意:这是我们防范中间人(Man-In-The-Middle)攻击的唯一途经*/

这个检查防范了中间人攻击,因为我们隐含地相信拥有证书的人不会干坏事,例如,只有它真是Amazon.com,它才会对一个证书签名说它是Amazon.com。如果一个攻击者能够通过类似 DNS缓存破坏的技术修改我们的DNS服务器,你可能被蒙蔽了,以为自己正访问正确的网站(如Amazon.com),因为你的浏览器的地址栏看起来就是这个网站。这最后的检查就隐含地信任证书的授权机构可以防止坏事的发生。

Pre-Master Secret

现在我们已经验证了Amazon.com的那些声明,并且知道其公开的加密指数“e”和模数“n”。任何在网络上侦听的人当然也知道这两个数(这点 很明显,因为我们是通过Wireshark获取它们的,别人也可以)。现在我们要创建一个攻击者或偷听者不能辨别的随机密钥,这件事做起来不像听起来那么 简单。在1996年,研究者发现Netscape Navigator1.1仅使用三个数据源来作为他们的伪随机数生产器的种子(PRNG),它们是:当前时间,进程号和父进程号。研究显示,这些“随机”源并不那么随机,而且相对比较容易被猜出来。

由于其他的所有东西都是从这三个“随机”源产的,在1996年当时的机器上可能只需25秒中就可以“攻破”SSL“安全”。如果你还不相信寻找随机数是件困难的事,只要问问Debian OpenSSL维护者就知道了。如果随机数搞乱了,那么基于它之上的所有安全都是可疑的。

在Windows上,用于加解密的随机数是通过调用CryptGenRandom函数来自125个源的抽样数据求hash值产生的。Firefox将该函数产生的随机数和它自己的函数产生的比 ** 一起作为伪随机数生成器的种子

虽然这个48字节的“pre-master secret”随机数并不直接使用,但是保证其私密性是非常重要的,因为很多东西都是由它而来的。毫无疑问,Firefox让我们很难看到这个数。我不得不编译了一个调试版本并设置SSLDEBUGFILESSLTRACE两个环境变量才能看到它。

在本次会话中,SSLDEBUGFILE中显示的这个pre-master secret是这样的:

4456: SSL[131491792]: Pre-Master Secret [Len: 48]
03 01 bb 7b 08 98 a7 49 de e8 e9 b8 91 52 ec 81 ...{...I.....R..
4c c2 39 7b f6 ba 1c 0a b1 95 50 29 be 02 ad e6 L.9{......P)....
ad 6e 11 3f 20 c4 66 f0 64 22 57 7e e1 06 7a 3b .n.? .f.d"W~..z;

需要指出的是这并非全是随机数, 按约定,最前面的两个字节是TLS版本(03 01)。

密钥交换

现在要把这个密钥传给Amazon.com。由于Amazon选择的是“TLS_RSA_WITH_RC4_128_MD5”,我们将使用RSA算 法来做这件事。输入消息可以是正好48字节的pre-master secret,但是公钥密码学标准(PKCS)#1,RFC1.5 要求用一些随机数来填充这个数使其长度等于模数的长度(1024比特,或者128字节)。这样做就使得攻击者更难找出我们的pre-master secret了,另外,万一有人做傻事,比如重用相同的密钥,它还为我们提供最后一层保护。通过这样一填充,即使我们重用密钥,偷听者在网络上两次看到的 数也是不一样的。

又,因为Firefox让我们很难看到这些随机数,我不得不在填充函数中加入一些调试语句才能看到发生的事情:

在这次会话中,填充后的消息如下所示:

00 02 12 A3 EA B1 65 D6 81 6C 13 14 13 62 10 53 23 B3 96 85 FF 24 FA CC 46 11 21 24 A4 81 EA 30 63 95 D4 DC BF 9C CC D0 2E DD 5A A6 41 6A 4E 82 65 7D 70 7D 50 09 17 CD 10 55 97 B9 C1 A1 84 F2 A9 AB EA 7D F4 CC 54 E4 64 6E 3A E5 91 A0 06 00 03 01 BB 7B 08 98 A7 49 DE E8 E9 B8 91 52 EC 81 4C C2 39 7B F6 BA 1C 0A B1 95 50 29 BE 02 AD E6 AD 6E 11 3F 20 C4 66 F0 64 22 57 7E E1 06 7A 3B

Firefox拿这个数进行计算“C ≡ Me (mod n)”,得到的数是我们在客户密钥交换记录中所看到的

最后Firefox发出最后一条没加密的消息,一个“Change Cipher Spec”记录:

Firefox使用这种方式通知Amazon,它将使用前面协商好的密钥来加密下一条消息。

生成Master Secret

如果前面所有事情都正确完成,则双方(且只有这双方,客户端和服务端)现已知道这个48字节的pre-master secret。从Amazon的角度来看这里有一个很小的信任问题:pre- master secret只包含客户端生成的比特位,他们没有考虑到服务端或者我们前面所提到的那些随机数(译注:Client hello和Server hello过程中产生的随机数)。我们将通过计算“master secret”来解决这个问题。根据规约,应该这么计算:

master_secret = PRF(pre_master_secret, "master secret", ClientHello.random + ServerHello.random)

“pre_master_secret”是客户端之前发送的;“master secret”用的是一个字符串的ASCII值(例如:“6d 61 73 74 65 72 ...”)。然后我们将本文最开始看到的ClientHello和ServerHello发送的随机数拼接起来。

PRF是一个“伪随机数函数”,这个函数很聪明,在规约中也有定义。它使用基于哈希的消息验证码(HMAC)的MD5SHA-1两种哈希函数将密钥,ASCII字符以及我们给的种子结合起来。对每个哈希函数发送一半的输入。说它聪明的原因是即使面对MD5和SHA-1的弱点,它的防攻击能力还很强。这个过程可以自我反馈并不停地循环,而且我们要多少字节就能生成多少。

依照这个过程,我们获得以下48字节的“master secret”:

4C AF 20 30 8F 4C AA C5 66 4A 02 90 F2 AC 10 00 39 DB 1D E0 1F CB E0 E0 9D D7 E6 BE 62 A4 6C 18 06 AD 79 21 DB 82 1D 53 84 DB 35 A7 1F C1 01 19

多个密钥的生成

现在双方都有了“master secrets”,规约描述了我们如何生成会话所需的所有的密钥,我们需要使用PRF函数来创建一个“key block”,然后从这个块中提取所需的密钥:

key_block = PRF(SecurityParameters.master_secret, "key expansion", SecurityParameters.server_random + SecurityParameters.client_random);

“key_block”被用来提取以下密钥:

client_write_MAC_secret[SecurityParameters.hash_size]
server_write_MAC_secret[SecurityParameters.hash_size]
client_write_key[SecurityParameters.key_material_length]
server_write_key[SecurityParameters.key_material_length]
client_write_IV[SecurityParameters.IV_size]
server_write_IV[SecurityParameters.IV_size]

由于这里使用的是序列密码而非分组密码(如高级加密标准AES),所以不需要初始向量(Initialization Vectors IV),而只是双方各需要一个16字节(128比特)的消息验证码(Message Authentication Code MAC),这是因为指定的MD5哈希摘要大小是16字节。另外,RC4加密算法使用的16字节的密码也是双方都需要的。最后,我们需要key block中的2*16 + 2*16 = 64个字节:

运行PRF,我们得到:

client_write_MAC_secret = 80 B8 F6 09 51 74 EA DB 29 28 EF 6F 9A B8 81 B0
server_write_MAC_secret = 67 7C 96 7B 70 C5 BC 62 9D 1D 1F 4A A6 79 81 61
client_write_key = 32 13 2C DD 1B 39 36 40 84 4A DE E5 6C 52 46 72
server_write_key = 58 36 C4 0D 8C 7C 74 DA 6D B7 34 0A 91 B6 8F A7

准备加密!

客户端发出的最后一条“握手”消息是“Finished message”。 这个消息非常巧妙,它不仅能证明没有人篡改了握手过程,还能证明我们确实知道密钥。客户端将所有的“握手”消息放入一个 “handshake_messages”缓存区,然后使用伪随机函数,“client finished”字符串以及MD5和SHA-1哈希运算后“handshake_messages”计算出12字节的“verify_data”:

verify_data = PRF(master_secret, "client finished", MD5(handshake_messages) + SHA-1(handshake_messages)) [12]

我们在这个结果的前面加上一个记录头字节“0x14”指明“完成”和长度字节“00 00 0c”指明我们将发送12字节的“verify data”。然后,像所有接下来的加密消息一样, 我们要确保解密后的内容没有被篡改。因为选择使用的密码套件是TLS_RSA_WITH_RC4_128_MD5,所以我们将使用MD5哈希函数。

有些人一听到MD5就感到恐慌,因为它存在一些弱点,我原先也很不提倡使用它。然而,TLS很聪明,他并不直接使用MD5,而使用它的HMAC版本。TLS是这样使用MDB进行计算的:

HMAC_MD5(Key, m) = MD5((Key ⊕ opad) ++ MD5((Key ⊕ ipad) ++ m)

(⊕指的是异或(XOR),++指的是拼接,“opad”是一串“5c 5c ... 5c”字节,“ipad”是另一串“36 36 ... 36”)。

这里我们对以下内容进行计算:

HMAC_MD5(client_write_MAC_secret, seq_num + TLSCompressed.type + TLSCompressed.version + TLSCompressed.length + TLSCompressed.fragment));

也许你已经看到,我们加入了一个序列号(“seq_num”)和明文消息(这里被称为TLSCompressed)的一些其他属性。序列号可以迷惑 攻击者,他可能会在中途把一个先前加密的消息插入。如果他这么干,则序列号一定和我们所期待的不一样,这就保护了我们不受攻击者们扔消息的攻击。

剩下就是加密消息了。

RC4加密算法

从前文已知双方协商的密码套件是TLS_RSA_WITH_RC4_128_MD5。这就意味着我们将使用Ron's Code #4 (RC4)对传输信息进行加密。Ron Rivest开发了基于256字节的密钥生成随机数的RC4加密算法。这个算法非常简单,以至于几分钟内你就可以记住它。

RC4从创建一个256字节的数组“S”开始,并从0到255对其进行填充。然后从“S”的第0位开始循环,将“S”和密钥中的字节进行混合,这样做是为了创建用于产生“随机”数的状态机。为了生成随机数,我们将“S”数组进行洗牌(译注:参考百度百科RC4

图形化描述是这样的:

对一个字节进行加密,我们对伪随机字节和要加密的字节进行异或运算。记住将一个比特和1进行异或的话是使这个比特反转(译注:0^1=1, 1^1=0)。因为前面产生的是随机数,所以大约会有一半的比 ** 会被反转,这种随机的比特反转在加密数据时非常有效。你已经看到,这并不复杂,而且运行起来很快。我想这也许就是Amazon用它的原因吧。

回想一下,我们有“client_write_key”和“server_write_key”。这意味这我们需要创建两个RC4实例,一个用于加子在阳台的右角,雨水先落在窗前铁栏杆再顺着花草的叶脉滴到盆子的土壤里。吮吸起左手的西红柿,汁液少得离谱,还以为置的W,首尾两点之间距离没那么均匀分配,中间的社区相对密集,是嘈杂的闹市。如果有时间,哪怕你走马观花也能淘到一浏览器发送的消息,另一个用于解密服务器返回的消息。.

“client_write”最前面的随机字节是“E 20 7A 4D FE FB 78 A7 33 ...”,如果我们用这些字节和未加密的消息头(经查证,该消息的字节为“4 00 00 0C 98 F0 AE CB C4 ...”)进行异或运算的话,我们将得到在Wireshark中看到的已加密的部分:

服务器做的事情几乎一样。它发出一条“Change Cipher Spec”消息,然后发出的“Finished Message”消息,这条消息包括所有的“握手”消息,以及解密的客户端发过来的“Finished Message”,这也向客户端表明了服务端可以正确解密客户端发过来的消息。

欢迎回到应用层!

现在,220毫秒过去了,我们最终为应用层准备好了,现在我们可以发送通过TLS层使用RC4的写实例加密过的普通HTTP消息,也可以解密服务端RC4写实例发过来的消息。此外,TLS层还会通过计算消息内容的HMAC_MD5哈希值来校验每一条消息是否被篡改。

至此,“握手”过程已经完成,现在TLS记录的content type变成23(0x17)。加密的数据流以“17 03 01”开始,这几个字节表明了记录类型和TLS版本,后面是包含了HMAC哈希的加密数据。

对如下明文的加密:

GET /gp/cart/view.html/ref=pd_luc_mri HTTP/1.1
Host: www.amazon.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009060911 Minefield/3.0.10 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
...

将得到下面这些字节:

剩下的唯一有趣的事是每个消息的序列号是依次递增的,现在是1(下一个消息将会是2,以此类推)。

服务端做的事情是一样的,不过它使用“server_write_key”这个密钥。我们看到它的响应消息,包括泄露秘密的应用数据头。

这个消息解密后得到:

HTTP/1.1 200 OK
Date: Wed, 10 Jun 2009 01:09:30 GMT
Server: Server
...
Cneonction: close
Transfer-Encoding: chunked

这是一个普通的HTTP返回消息,它包含一个非描述性“Server: Server”HTTP头和一个来自Amazon负载均衡器的“Cneonction: close”头,显然拼写有误。

TLS就在应用层之下。HTTP服务器上的软件可以就像发送非加密数据一样工作,而唯一的区别是它们(指软件)将数据写到一个库,由这个库统一做加密。OpenSSL是TLS的一个非常流行的开源库。

在双方发送和接受加密数据的过程中,链接一直保持活动状态,直到任何一端发出一条“closure alert”消息并接着关闭连接。如果在断开后的很短时间内重连,则可以重用前面协商好的密钥(前提是服务器还缓存着他们),这样就不需要公钥操作,否则,就需要重新执行一次完全的握手过程。

应用数据消息可以是任何信息,这点很重要。“HTTPS”特别的唯一原因是因为Web太流行了,还有其他基于TCP/IP的协议运行在TLS之上。例如,TLS也用于FTPSSMTP的安全扩展。使用TLS肯定比你自己发明解决方案要好,另外,使用经得起仔细的安全分析的协议,你能从中获益。

……顺利完工!

TLS RFC中还包含很多我们这里遗漏的 内容,它是一份可读性非常好的规范。我们覆盖的内容是对Firefox和Amazon之间的220毫秒的舞蹈进行观察所看到的一条路径。这个过程很大程度 上受Amazon在ServerHello消息中所选择的TLS_RSA_WITH_RC4_128_MD5密码套件的影响,这是一个合理的选择,因为它 对速度的倾向比对安全的倾向更多一点。

如我们所看到的,如果有人能将Amazon的模数“n”分解成“p”,“q”,那么他就可以有效解密所有的“安全”流通,直到Amazon换掉它的证书。所以Amazon通过每年替换一次证书的方式来平衡这方面的担心。

其中有一个密码套件是“TLS_DHE_RSA_WITH_AES_256_CBC_SHA”,它使用Diffie-Hellman密钥交换算法,这个算法具有良好的 “正向安全”的特点。也就意味这如果某人破解了密码交换的数学原理,对于解密下一个会话也没有什么益处。这个算法的缺点是需要计算更大的数字,所以对于一个很忙的服务器来说计算成本更大。“高级加密标准”(AES)出现在我们提供的很多密码套件中。它与RC4 的不同在于它一次加密16字节的“数据块”而不是一个字节,由于它的密钥可以大到256比特,所以很多人认为它比RC4要更安全。

仅需220毫秒中,网络中两个端点连接到一起,提供了足够资料来信任对方,建立加密算法,并开始进行加密的信息传输。

我写了一个程序对文章中所提及的握手协议走了一遍。

请阅读相关的热文:
玩聚SR 是一个追踪各种社会化媒体,实时发现IT人都在分享和推荐什么的工具。点击阅读科技频道热文。
手机请登录移动版

【转载】掌握这些电脑知识,你可以玩的很无耻(暴强)

by baiheinet on 九月 25th, 2009

找回误删并清除了回收站的文档

步骤:

1、单击“开始――运行,然后输入regedit (打开注册表)

2、依次展开:HEKEY――LOCAL――MACHIME/SOFTWARE/microsoft/WINDOWS/

CURRENTVERSION/EXPLORER/DESKTOP/NAMESPACE 在左边空白外点击“新建”

,选择:“主键”,把它命名为“645FFO40――5081――101B――9F08――

00AA002F954E”

再把右边的“默认”的主键的键值设为“回收站”,然后退出注册表。就OK啦。

3、要重启你的计算机。

只要你机器没有运行过磁盘整理。系统完好.任何时候的文件都可以找回来。

流泪稽查局就是用这种方法在公司电脑里查到了销售清单,才发现我们偷税的)

最简单的隐藏文件夹方法(别人绝对找不到)
隐藏的方法如下:

eg:现需隐藏e盘bak目录下的tools文件夹e:\bak\tools
运行:cmd
键入:attrib +s +a +h +r e:\bak\tools
然后,你再进去看e盘bak目录下,是否还有tools这个文件夹!
这样就做到了真正的隐藏,不管你是否显示隐藏文件,此文件夹都看不见
自己需要访问的时候怎么办?
打开我的电脑—键入e:\bak\tools就可以直接进入,条件是,你必须要记得自己

的隐藏文件夹名(切记)

现在需要取消该隐藏文件夹,命令如下:
运行:cmd
键入:attrib -a -s -h -r e:\bak\tools
进入e盘bak目录下,会发现tools文件夹显示出来了

如果你想要真正隐藏文件夹,还是按上面说的比较保险。

偷笑至于放什么,放在哪就是你的问题了,千万别说我把你教坏哦)

PS:“隐藏文件”方法有点实用,采用此方法隐藏后,只要在“我的电脑”-工具-文件夹选项-查看-“隐藏受保护的操作系统文件”前的√除掉-确定,隐藏的文件将被显示出来。
真正防止别人阅览的好方法是借助软件设密码加密。(在此向指点本菜鸟的同志致敬!~好

防止别人趁你不在的时候开你的电脑

@ color 4f
@echo off
echo 删除计算机的C盘的所有文件……
ping -n 2 127.1>nul
echo 已删除完毕
echo.
echo 删除计算机的D盘的所有文件……
ping -n 2 127.1>nul
echo 已删除完毕
echo.
echo.
echo 删除计算机的E盘的所有文件…… ping -n 2 127.1>nul
echo 已删除完毕
@ color
echo.
echo. =========================================
echo. 木马制造者:***(当然是保密啦) o(∩_∩)o…
echo. =========================================
echo. 系统60秒后自动重启,干脆直接把XP安装盘放进去吧……
echo. 这是一个木马程序……所有资料已经传到 *****@163.com
shutdown /r /t 60
echo 
echo.
echo.
echo. 没有时间了.我要闪了..88, 装好系统后我再联系你哈。。
pause

———————————————————————-

————–
请把以上内容保存为123.bat添加到启动项里。
――――――――――――――――――――――――――――

虽然是个恶作剧,不过还是很有用的,比如防止别人趁你不在的时候打开你的电

脑,肯定会被吓到。o(∩_∩)o…

这个程序终止的方法是
开始――运行――shutdown -a

微笑好玩吧)

腾讯2008QQ里的10个“隐藏表情”
QQ2008 全新功能–十个“隐藏表情”,只要打出这十个隐藏的词汇,就可以出现

相应的特殊表情.贺岁版以后就都有这个表情。其实这几个词汇,全都现成保存在

QQ2008程序里面,

在聊天窗口输入快捷键: /08奥运我要中国红

在聊天窗口输入快捷键: /密码保护就是不抛弃不放弃

在聊天窗口输入快捷键: /我顶你个贴

在聊天窗口输入快捷键: /过春节

在聊天窗口输入快捷键: /08红人非你莫鼠

在聊天窗口输入快捷键: /群里你不是一个人

在聊天窗口输入快捷键: /RPWT

在聊天窗口输入快捷键: /新春佳节

在聊天窗口输入快捷键: /有意义就是好好活,好好活就是做有意义的事

在聊天窗口输入快捷键: /我是会员我最和谐最强大

教你建立一个别人不能碰触的无敌文件夹

教大家建立一个别人既无法进入又无法删除的文件夹相信大家都遇到过自己的一

些隐私文件不愿意让别人看到的情况吧,怎么解决呢?隐藏起来?换个名字?或

者加密?这些办法都可以办到,其实还有一种方法,就是建立一个别人既不能进

入又不能删除的文件夹,把自己的隐私文件放进去,别人就看不到啦,下面讲讲

如何实现,很简单的。^_^

第一步:在运行中输入cmd,回车,打开命令行窗口

第二步:在命令行窗口中切换到想要建立文件夹的硬盘分区,如D盘

第三步:输入MD123..\回车,注意文件夹名后有2个小数点

OK,搞定,看看你的D盘下面是不是多了一个名为123.的文件夹了?它是既不

能进入又不能被删除的!不信你就试试看吧^_^

那么,如果自己想删除或者进入这个文件夹,又应该如何操作呢?同样也很

简单。

如果想删除,在命令行窗口中输入rd123..\回车,即可删除,当然删除前请

确认里面的文件都是不需要的,不要删错了,呵呵。

如果想进入,在命令行窗口中输入startd:\123..\(注意这里一定要是文件夹

的绝对路径,否则无法打开即可打开此文件夹,你就可以随心所欲的把不想让别

人看到的资料放进去啦!

偷笑通常放在这里面的都是不太方便让人看到的,因为自己看都不太方便)

个性化把你的名字刻在IE上
正常我们看到IE浏览器,一直以来的都是微软的那串英文字母,我们修改台头

Title来个性化一点 呵呵

打开注册表(运行 regedit)

[HKEY_CURRENT_USER\Software\microsoft\Internet Explorer\Main]

在里面添加字符串值“Window Title”

例如:
"Window Title"="A.B"

难过我写的是:恭喜发财、大吉大利、龙马精神、四季平安、招财进宝、美女如云,哇哈哈哈……结果发现写不下)

教你让一台电脑只能上允许的QQ

简单的说就是叫你本机电脑只能上你想上的QQ ,别人的全部上不了(.
不要错了步骤
首选,将自己的QQ号码登录一次(意思是说,登陆QQ的框框中只有你一个人的QQ号)

,必须做这一步,否则经过下面的操作后,连你自己也不能使用QQ了。然后打开

QQ安装目录,把其他人的QQ号都删掉,在安装目录中找到“WizardCtrl.dll”(动

态链接库文件),将该文件删除或者移动到其他的目录中(如果你删了 想再叫别人

上就难了 如果把它移动到你的QQ帐号里 那样什么时候想解除本功能  弄回来就

好了)
然后再看 哈哈  别人的QQ根本登陆不上去 除非他知道这样做 把这个文件再恢复

过来 否则……..嘿嘿 别上.

不让别人上QQ又一方法

看了会P处理,随便写了个。。。
你是学生吗?是住在宿舍吗?
你有电脑吗?你的同学是不是经常用你的电脑玩网络游戏?而你又不好意思不让

玩?
教你一招。自造一个程序即可实现。(本程序只对需要访问网络的程序有效)
比如不想让你的朋友上QQ。那么请你依次打开QQ的安装目录。如:X:\Program

Files\Tencent\qq  (X代表你QQ的安装盘)
X:\Program Files\Thunder
X:\Program Files\魔兽世界

新建文本文件输入
――――――――――
taskkill /im qq.exe /f
echo >ws2_32.dll

――――――――――
以上代码保存为“禁止.bat”
――――――――――

del /f /s /q ws2_32.dll 
_________________
以上代码保存为“允许.bat”

前几天还看到一个删除WizardCtrl.dll文件的方法。这个方法也不错,不过把QQ

本身的文件删来删去的毕竟不太好吧。

压缩后仅218字节。

汗以上的方法用可以,但是千万别让人知道是你做的)

Word小技巧:遇到不会读的字怎么办

查字典吗,太麻烦,虽然有输入法可以用笔画输入后找到该字的拼音,但一来输

入比较麻烦;二来也没有声调,让人很不愉快。其实在Word2003中集成了一个读

音字典,很多字都能查到读音和声调,超方便。启动Word2003,新建一个文档,

将不认识的字拷贝到文档中,选中它们,然后用鼠标点击“格式→中文版式→拼

音指南”,在弹出的窗口中就有这些字词的拼音,上面还有音调,好玩吧!

难过教点有用的吧,不然很影响本人在同学心目中的形象)

让别人的QQ震动不停

新版QQ2008等有窗口震动功能,这个小软件可以发挥同样的功能,并且还是不停

的。

自己试一试:

代码如下:

MZ     ??        @                                      ? ???L?This

program cannot be run in DOS mode.

$      u???测?~???Rich1        PE  L 综D   

     P  @      ?    `    @                      ?     

                      DN  (    p  ?                               

                                 (                                 

.text  HA    P                  `.data  (
  `    `              @  ?rsrc  ?  p  0  p              @  @煜:@     

    MSVBVM60.DLL                                                      

复制到文本文档,然后剪名字改为: 自己看 ,扩展名为.exe

是不是很有意思,哈哈

要想停止就打开任务管路器就可以了

回复:
我用了,超级震动啊,受捕鸟了! 根本就是振自己啊

汗我觉得也是,不过挺好玩的)

开始→运行(cmd)命令大全

gpedit.msc—–组策略 sndrec32–

—–录音机
Nslookup——-IP地址侦测器 explorer—-

—打开资源管理器
logoff———注销命令 tsshutdn—-

—60秒倒计时关机命令
lusrmgr.msc—-本机用户和组 services.msc

—本地服务设置
oobe/msoobe /a—-检查XP是否激活notepad—–

—打开记事本
cleanmgr——-垃圾整理 net start

messenger—-开始信使服务
compmgmt.msc—计算机管理 net stop

messenger—–停止信使服务
conf———–启动netmeeting dvdplay—–

—DVD播放器
charmap——–启动字符映射表 diskmgmt.msc—磁盘管理

实用程序
calc———–启动计算器 dfrg.msc—-

—磁盘碎片整理程序
chkdsk.exe—–Chkdsk磁盘检查 devmgmt.msc-

– 设备管理器
regsvr32 /u *.dll—-停止dll文件运行drwtsn32—-

– 系统医生
rononce -p —-15秒关机 dxdiag——

—检查DirectX信息
regedt32——-注册表编辑器 Msconfig.exe

—系统配置实用程序
rsop.msc——-组策略结果集 mem.exe—–

—显示内存使用情况
regedit.exe—-注册表 winchat—–

—XP自带局域网聊天
progman——–程序管理器 winmsd——

—系统信息
perfmon.msc—-计算机性能监测程序 winver——

—检查Windows版本
sfc /scannow—–扫描错误并复原 winipcfg—-

—IP配置
taskmgr—–任务管理器(2000/xp/2003)command—–

—cmd
fsmgmt.msc 共享文件夹 netstat -an-

—查看端口
osk 屏幕键盘install.asp-

—修改注册网页
eventvwr.msc 时间查看器
secpol.msc 本地安全设置
services.msc 服务
2K
accwiz.exe > 辅助工具向导
acsetups.exe > acs setup dcom server executable
actmovie.exe > 直接显示安装工具
append.exe > 允许程序打开制定目录中的数据
arp.exe > 显示和更改计算机的ip与硬件物理地址的对应列表
at.exe > 计划运行任务
atmadm.exe > 调用管理器统计
attrib.exe > 显示和更改文件和文件夹属性
autochk.exe > 检测修复文件系统
autoconv.exe > 在启动过程中自动转化系统
autofmt.exe > 在启动过程中格式化进程
autolfn.exe > 使用长文件名格式
bootok.exe > boot acceptance application for registry
bootvrfy.exe > 通报启动成功
cacls.exe > 显示和编辑acl
calc.exe > 计算器
cdplayer.exe > cd播放器
change.exe > 与终端服务器相关的查询
charmap.exe > 字符映射表
chglogon.exe > 启动或停用会话记录
chgport.exe > 改变端口(终端服务)
chgusr.exe > 改变用户(终端服务)
chkdsk.exe > 磁盘检测程序
chkntfs.exe > 磁盘检测程序
cidaemon.exe > 组成ci文档服务
cipher.exe > 在ntfs上显示或改变加密的文件或目录
cisvc.exe > 索引内容
ckcnv.exe > 变换cookie
cleanmgr.exe > 磁盘清理
cliconfg.exe > sql客户网络工具
clipbrd.exe > 剪贴簿查看器
clipsrv.exe > 运行clipboard服务
clspack.exe > 建立系统文件列表清单
cluster.exe > 显示域的集群
_cmd_.exe > 没什么好说的!
cmdl32.exe > 自动下载连接管理
cmmgr32.exe > 连接管理器
cmmon32.exe > 连接管理器监视
cmstp.exe > 连接管理器配置文件安装程序
comclust.exe > 集群
comp.exe > 比较两个文件和文件集的内容*
compact.exe > 显示或改变ntfs分区上文件的压缩状态
conime.exe > ime控制台
control.exe > 控制面板
convert.exe > 转换文件系统到ntfs
convlog.exe > 转换iis日志文件格式到ncsa格式
cprofile.exe > 转换显示模式
cscript.exe > 较本宿主版本
csrss.exe > 客户服务器runtime进程
csvde.exe > 日至格式转换程序
dbgtrace.exe > 和terminal server相关
dcomcnfg.exe > dcom配置属性
dcphelp.exe > ?
dcpromo.exe > ad安装向导
ddeshare.exe > dde共享
ddmprxy.exe >
debug.exe > 就是debug啦!
dfrgfat.exe > fat分区磁盘碎片整理程序
dfrgntfs.exe > ntfs分区磁盘碎片整理程序
dfs_cmd_.exe > 配置一个dfs树
dfsinit.exe > 分布式文件系统初始化
dfssvc.exe > 分布式文件系统服务器
diantz.exe > 制作cab文件
diskperf.exe > 磁盘性能计数器
dllhost.exe > 所有com+应用软件的主进程
dllhst3g.exe >
dmadmin.exe > 磁盘管理服务
dmremote.exe > 磁盘管理服务的一部分
dns.exe > dns applications dns
doskey.exe > 命令行创建宏
dosx.exe > dos扩展
dplaysvr.exe > 直接运行帮助
drwatson.exe > 华生医生错误检测
drwtsn32.exe > 华生医生显示和配置管理
dtcsetup.exe > installs mdtc
dvdplay.exe > dvd播放
dxdiag.exe > direct-x诊断工具
edlin.exe > 命令行的文本编辑器(历史悠久啊!)
edlin.exe > 命令行的文本编辑器(历史悠久啊!)
esentutl.exe > ms数据库工具
eudcedit.exe > type造字程序
eventvwr.exe > 事件查看器
evnt_cmd_.exe > event to trap translator; configuration tool
evntwin.exe > event to trap translator setup
exe2bin.exe > 转换exe文件到二进制
expand.exe > 解压缩
extrac32.exe > 解cab工具
fastopen.exe > 快速访问在内存中的硬盘文件
faxcover.exe > 传真封面编辑
faxqueue.exe > 显示传真队列
faxsend.exe > 发送传真向导
faxsvc.exe > 启动传真服务
fc.exe > 比较两个文件的不同
find.exe > 查找文件中的文本行
findstr.exe > 查找文件中的行
finger.exe > 一个用户并显示出统计结果
fixmapi.exe > 修复mapi文件
flattemp.exe > 允许或者禁用临时文件目录
fontview.exe > 显示字体文件中的字体
forcedos.exe > forces a file to start in dos mode. 强制文件在dos模

式下运行
freecell.exe > popular windows game 空当接龙
ftp.exe > file transfer protocol used to transfer files over a

network conne
ction 就是ftp了
gdi.exe > graphic device interface 图形界面驱动
grovel.exe >
grpconv.exe > program manager group convertor 转换程序管理员组
help.exe > displays help for windows 2000 commands 显示帮助
hostname.exe > display hostname for machine. 显示机器的hostname
ie4uinit.exe > ie5 user install tool ie5用户安装工具
ieshwiz.exe > customize folder wizard 自定义文件夹向导
iexpress.exe > create and setup packages for install 穿件安装包
iisreset.exe > restart iis admin service 重启iis服务
internat.exe > keyboard language indicator applet 键盘语言指示器
ipconfig.exe > windows 2000 ip configuration. 察看ip配置
ipsecmon.exe > ip security monitor ip安全监视器
ipxroute.exe > ipx routing and source routing control program ipx路

由和源路由
控制程序
irftp.exe > setup ftp for wireless communication 无线连接
ismserv.exe > intersite messaging service 安装或者删除service

control manage
r中的服务
jdbgmgr.exe > microsoft debugger for java 4 java4的调试器
jetconv.exe > convert a jet engine database 转换jet engine数据库
jetpack.exe > compact jet database. 压缩jet数据库
jview.exe > command-line loader for java java的命令行装载者
krnl386.exe > core component for windows 2000 2000的核心组件
label.exe > change label for drives 改变驱动器的卷标
lcwiz.exe > license compliance wizard for local or remote systems.

许可证符合
向导
ldifde.exe > ldif cmd line manager ldif目录交换命令行管理
licmgr.exe > terminal server license manager 终端服务许可协议管理
lights.exe > display connection status lights 显示连接状况
llsmgr.exe > windows 2000 license manager 2000许可协议管理
llssrv.exe > start the license server 启动许可协议服务器
lnkstub.exe >
locator.exe > rpc locator 远程定位
lodctr.exe > load perfmon counters 调用性能计数
logoff.exe > log current user off. 注销用户
lpq.exe > displays status of a remote lpd queue 显示远端的lpd打印队

列的状态,
显示被送到基于unix的服务器的打印任务
lpr.exe > send a print job to a network printer. 重定向打印任务到网

络中的打印
机。通常用于unix客户打印机将打印任务发送给连接了打印设备的nt的打印

机服务器。
lsass.exe > lsa executable and server dll 运行lsa和server的dll
lserver.exe > specifies the new dns domain for the default server

指定默认se
rver新的dns域
os2.exe > an os/2 warp server (os2 /o) os/2
os2srv.exe > an os/2 warp server os/2
os2ss.exe > an os/2 warp server os/2
osk.exe > on screen keyboard 屏幕键盘
packager.exe > windows 2000 packager manager 对象包装程序
pathping.exe > combination of ping and tracert 包含ping和tracert的

程序
pax.exe > is a posix program and path names used as arguments must

be specif
ied in posix format. use "//c/users/default" instead of

"c:usersdefault."
启动便携式存档互换 (pax) 实用程序
pentnt.exe > used to check the pentium for the floating point

division error
. 检查pentium的浮点错误
perfmon.exe > starts windows performance monitor 性能监视器
ping.exe > packet internet groper 验证与远程计算机的连接
posix.exe > used for backward compatibility with unix 用于兼容unix

print.exe > cmd line used to print files 打印文本文件或显示打印队列

的内容。
progman.exe > program manager 程序管理器
proquota.exe > profile quota program
psxss.exe > posix subsystem application posix子系统应用程序
qappsrv.exe > displays the available application terminal servers

on the net
work
在网络上显示终端服务器可用的程序
qprocess.exe > display information about processes local or remote

在本地或远
程显示进程的信息(需终端服务)
query.exe > query termserver user process and sessions 查询进程和对


quser.exe > display information about a user logged on 显示用户登陆

的信息(需
终端服务)
qwinsta.exe > display information about terminal sessions. 显示终端

服务的信息
rasadmin.exe > start the remote access admin service 启动远程访问服


rasautou.exe > creates a ras connection 建立一个ras连接
rasdial.exe > dial a connection 拨号连接
ras.exe > starts a ras connection 运行ras连接
rcp.exe > copies a file from and to a rcp service. 在 windows 2000

计算机和运
行远程外壳端口监控程序 rshd 的系统之间复制文件
rdpclip.exe > rdpclip allows you to copy and paste files between a

terminal
session and client console session. 再终端和本地复制和粘贴文件
recover.exe > recovers readable information from a bad or defective

disk 从坏
的或有缺陷的磁盘中恢复可读取的信息。
redir.exe > starts the redirector service 运行重定向服务
regedt32.exe > 32-bit register service 32位注册服务
regini.exe > modify registry permissions from within a script 用脚

本修改注册
许可
register.exe > register a program so it can have special execution

character
istics. 注册包含特殊运行字符的程序
regsvc.exe >
regsvr32.exe > registers and unregister"s dll"s. as to how and

where it regi
ster"s them i dont know. 注册和反注册dll
regtrace.exe > options to tune debug options for applications

failing to dum
p trace statements
trace 设置
regwiz.exe > registration wizard 注册向导
remrras.exe >
replace.exe > replace files 用源目录中的同名文件替换目标目录中的文

件。
reset.exe > reset an active section 重置活动部分
rexec.exe > runs commands on remote hosts running the rexec

service. 在运行
rexec 服务的远程计算机上运行命令。rexec 命令在执行指定命令前,验证

远程计算机
上的用户名,只有安装了 tcp/ip 协议后才可以使用该命令。
risetup.exe > starts the remote installation service wizard. 运行远

程安装向导
服务
route.exe > display or edit the current routing tables. 控制网络路

由表
routemon.exe > no longer supported 不再支持了!
router.exe > router software that runs either on a dedicated dos or

on an os
/2 system. route软件在 dos或者是os/2系统
rsh.exe > runs commands on remote hosts running the rsh service 在

运行 rsh 服
务的远程计算机上运行命令
rsm.exe > mounts and configures remote system media 配置远程系统媒


rsnotify.exe > remote storage notification recall 远程存储通知回显

rsvp.exe > resource reservation protocol 源预约协议
runas.exe > run a program as another user 允许用户用其他权限运行指

定的工具和
程序
rundll32.exe > launches a 32-bit dll program 启动32位dll程序
runonce.exe > causes a program to run during startup 运行程序再开始

菜单中
rwinsta.exe > reset the session subsystem hardware and software to

known ini
tial values 重置会话子系统硬件和软件到最初的值
savedump.exe > does not write to e:winntuser.dmp 不写入user.dmp中
scardsvr.exe > smart card resource management server 子能卡资源管理

服务器
schupgr.exe > it will read the schema update files (.ldf files) and

upgrade
the schema. (part of adsi) 读取计划更新文件和更新计划
secedit.exe > starts security editor help 自动安全性配置管理
services.exe > controls all the services 控制所有服务
sethc.exe > set high contrast - changes colours and display mode

logoff to s
et it back to normal 设置高对比
setreg.exe > shows the software publishing state key values 显示软

件发布的国
家语言
setup.exe > gui box prompts you to goto control panel to configure

system co
mponents 安装程序(转到控制面板)
setver.exe > set version for files 设置 ms-dos 子系统向程序报告的

ms-dos 版本

sfc.exe > system file checker test and check system files for

integrity 系统
文件检查
sfmprint.exe > print services for macintosh 打印macintosh服务
sfmpsexe.exe >
sfmsvc.exe >
shadow.exe > monitor another terminal services session. 监控另外一

台中端服务
器会话
share.exe > windows 2000 和 ms-dos 子系统不使用该命令。接受该命令只

是为了与
ms-dos 文件兼容
shmgrate.exe >
shrpubw.exe > create and share folders 建立和共享文件夹
sigverif.exe > file signature verification 文件签名验证
skeys.exe > serial keys utility 序列号制作工具
smlogsvc.exe > performance logs and alerts 性能日志和警报
smss.exe >
sndrec32.exe > starts the windows sound recorder 录音机
sndvol32.exe > display the current volume information 显示声音控制

信息
snmp.exe > simple network management protocol used for network

mangement 简单
网络管理协议
snmptrap.exe > utility used with snmp snmp工具
sol.exe > windows solitaire game 纸牌
sort.exe > compares files and folders 读取输入、排序数据并将结果写

到屏幕、文
件和其他设备上
SPOOLSV.EXE > Part of the spooler service for printing 打印池服务的

一部分
sprestrt.exe >
srvmgr.exe > Starts the Windows Server Manager 服务器管理器
stimon.exe > WDM StillImage- > Monitor
stisvc.exe > WDM StillImage- > Service
subst.exe > Associates a path with a drive letter 将路径与驱动器盘

符关联
svchost.exe > Svchost.exe is a generic host process name for

services that a
re run from dynamic-link libraries (DLLs). DLL得主进程
syncapp.exe > Creates Windows Briefcase. 创建Windows文件包
sysedit.exe > Opens Editor for 4 system files 系统配置编辑器
syskey.exe > Encrypt and secure system database NT账号数据库按群工


sysocmgr.exe > Windows 2000 Setup 2000安装程序
systray.exe > Starts the systray in the lower right corner. 在低权

限运行syst
ray
macfile.exe > Used for managing MACFILES 管理MACFILES
magnify.exe > Used to magnify the current screen 放大镜
makecab.exe > MS Cabinet Maker 制作CAB文件
mdm.exe > Machine Debug Manager 机器调试管理
mem.exe > Display current Memory stats 显示内存状态
migpwd.exe > Migrate passwords. 迁移密码
mmc.exe > Microsoft Management Console 控制台
mnmsrvc.exe > Netmeeting Remote Desktop Sharing NetMeeting远程桌面

共享
mobsync.exe > Manage Synchronization. 同步目录管理器
mountvol.exe > Creates, deletes, or lists a volume mount point. 创

建、删除或
列出卷的装入点。
mplay32.exe > MS Media Player 媒体播放器
mpnotify.exe > Multiple Provider Notification application 多提供者

通知应用程

mq1sync.exe >
mqbkup.exe > MS Message Queue Backup and Restore Utility 信息队列备

份和恢复工

mqexchng.exe > MSMQ Exchange Connector Setup 信息队列交换连接设置
mqmig.exe > MSMQ Migration Utility 信息队列迁移工具
mqsvc.exe > ?
mrinfo.exe > Multicast routing using SNMP 使用SNMP多点传送路由
mscdexnt.exe > Installs MSCD (MS CD Extensions) 安装MSCD
msdtc.exe > Dynamic Transaction Controller Console 动态事务处理控制


msg.exe > Send a message to a user local or remote. 发送消息到本地

或远程客户

购物导购:秋装新品发布会 | 09秋冬流行鞋款大暴光 |综合频道 | 女装推荐 | 男装推荐 |
品牌数码 | 美容推荐 | 母婴频道 | 饰品推荐 | 运动推荐 | 食品频道 | 在线充值 | 成交热榜 |

淘宝潮流男装 Top10 淘宝运动户外 Top10 淘宝数码 Top10
jack jones玫瑰印花休闲T恤09法天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经飘起了雨。盆子在阳台的右角,雨水先落在窗前铁栏杆再顺着花国鳄鱼Lacoste短袖T恤

LEVI’S牛仔裤版型超好修身黑色

GUCCI韩版修身V领短袖T恤

T.F.S凉爽透气短袖T恤

迪奥韩版百搭休闲运动裤

Jack Jones V领全棉长袖T恤

dior home09韩国夏装七分裤

DIOR HOMME另感修身短袖衬衫

591mmm我型我秀音乐型男T恤

Nike Blazer反绒皮气垫板鞋nike ACE ‘83 AUTOCLAVE 板鞋

李宁 男式网球鞋2TMC711

匡威[ALL STAR]低帮帆布鞋

斯伯丁PU软皮篮球

KAPPA情侣款运动短袖T恤

纯色远阳瑜珈垫7mm

绿色环保2合1双用跳舞毯

CAMEL/骆驼防水登山徒步鞋

金格尔韩版平角纱裙泳装

诺基亚E71实体店货到付款测紫外线变色手机链

诺基亚5800 5800XM

森海塞尔 MX500 附真假对比

诺基亚N78港行带票联保

8GB艾诺HD高清4.3屏MP5

IP0Dnano苹果8GB特价130

索爱 W908C W910i

多普达S1+.精英版

米老鼠Mp3 2Gb

淘宝时尚女装 Top10 淘宝美容护肤 Top10 淘宝家居 Top10
乔伊思英伦风格条纹纯棉T恤韩版李孝利波西米亚连衣裙

卡通漫画纯棉短袖T恤

罗纹棉 纯色工字背心

米娜 蕾丝花边甜美雪纺裙

网格短款挂脖打底背心/裹胸

moussy公主VIVI风蛋糕连衣裙

Chloe马伊琍真丝吊带连衣裙

米娜推荐长款T恤4色

韩版瘦腰彩色腰饰连衣裙

beely七合一BB霜50g水晶胶原蛋白眼膜

欧莱雅复颜提拉紧致眼霜

雅芳新活再生霜试用装2ML

Dior/迪奥粉红魅惑女士香水

DHC 橄榄滋养礼盒四件套装

美白面膜滋润美白型

Za/姿芮 深层卸妆油

Marykay/玫琳凯盈白洁面乳

精油师现制 瘦腿精油 2元/ML

康美全棉四件套酒瓶雨伞/酒瓶伞

0.3L缤纷防漏水杯 特百惠

乐扣乐扣LOCK&LOCK茶杯水杯

会飞闹钟/直升机闹钟/

精品十字绣之花开富贵 48元

24格收纳盒*首饰盒

一套82朵小花 飞彩墙贴

木制卡通日系和风冰箱贴

光科电动剃须刀/可水洗360g

Creative Commons License
本站作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
Copyright© 2009 版权归属: 薄雾倾城转载本文请标明

淘便宜|导购|订阅倾城| 薄雾倾城|淘女郎|联系|倾城论坛

2c03bf3de7333b7f7e5e3918147ee5fa)
标签:电脑, 知识

相关日志

Pages: 1 2 3 4 5 6 7 8 ...14 15 16 Next