[转]你对PHP6认识多少?

去年在巴黎举行的PHP开发者大会中,PHP6开发的消息开始流传开来,
于PHP大会讨论的PHP6,将有很大幅度的变化,但这只是草案阶段,
并不代表所有会议的机率都会随着PHP6的发布而包含记录中所有的变更
也就是说,在发布PHP6之前,还是会有异动的情形,但是可以确定的是
下面所列的数项变化,将会随着PHP6一同面世(当然不是百分百乐,
赶快来看看这些新特性吧

1.支持Unicode
支持Unicode是有其必然,虽然Unicode占用较多的空间,但Unicode带来
的便利性,远超过占用空间的缺点,尤其在国际化的今天,硬件设备越来
越强大,网速也大幅度的提升,这么一点小小的缺点是可以忽略的。另外
一点,PHP也可以在.ini文件中设定是否开启支持Unicode,决定权在你自己,
这是一个不错的点子,关掉Unicode的支持,PHP的性能并不会有大幅度的
提升,主要的影响在于需要引用字符串的函数。

2.Register Globals 将被移除
这是一个重要的决定,说多新进的PHP开发者会觉得Register Globals满
方便的,但是却忽略了Register Globals会带来程序上安全性的隐患,大
多数的主机上此项功能是关闭的,印象中从PHP4.3.x版开始时,此项默认
设置值即是关闭状态,PHP6正式移除Register Globals也代表着如果程序
是由PHP3时代的产物,将完全无法使用,除了改写一途外,别无他法。相
信现在的PHP世界里,仍使用PHP3时代所产生的程序应该是少之又少。

3.Magic Quotes 将消失
Magic Quotes主要是自动转义需要转义的字符,此项功能移除叶符合大多
数PHP开发者的心声。

4.Safe Mode 取消
老实说,这个模式不知道哪里不好,取消就取消吧,反正也用不到

5.’var’ 别名为 ‘public’
在类中的var声明变成public的别名,相信是为了兼容PHP5而作的决定,
PHP6现在也可以称作为OO语言了。

6.通过引用返回将出错
现在透过引用返回编译器将会报错 例如$a =& new b()、function &c(),
OO语言默认就是引用,所以不需要再使用&了。

7.zend.ze1 compatbility mode 将被移去
Zend.ze1相容模式将被移去,PHP5是为兼容旧有PHP4,所以在.ini中可选择是否
开启相容模式,原因在于PHP5使用的是第二代解析引擎,但是相容模式并不是百
分之百能解析PHP4语法,所以旧时代的产物,移除。

8.Freetype 1 and GD 1 support 将不见
这两个是很久的Libs,所以不再支持,GD1早已被现在的GD2取代了。

9.dl() 被移到 SAPI 中
dl()主要是让设计师加载extension Libs,现在被移到 SAPI 中

10.Register Long Array 去除
从PHP5起默认是关闭,再PHP6中正式移除。

11.一些Extension的变更
例如 XMLReader 和 XMLWriter 将不再是以Extension的方式出现,他们将被移入
到PHP的核心之中,并且默认是开启,ereg extension将被放入PECL,代表着它将
被移出PHP核心,这也是为了让路给新的正则表达式extension,
此外,Fileinfo extension 也将被导入PHP的核心之中。

12.APC将被导入核心
这是一个提高PHP性能的功能,现在它将被放入PHP核心中,并且可以选择是否启用APC

13.告别ASP风格的起始标签
原来是为了取悦ASP开发者转向使用PHP,现今已经不再需要这种做法了,

最后,别期望PHP6的性能可以全面超过PHP5,有可能的是PHP6的执行效率会比
PHP5还要来的慢的,但是可以预期的是,PHP开发小组将会努力的完善PHP5,超
越PHP5。
那么,对PHP6有兴趣的朋友现在可以到PHP官方网站上下载,试试这些功能是否真的已经
在PHP6中体现出来了,下载地址http://snaps.php.net/

Read: 637

JavaScript 不只是脚本

发一篇关于JavaScript的文章,因为JS或者说这中界面技术太有用了。Hoho

JavaScript似乎一直都当作是解析型的脚本语言,程序开发人员往往对此不懈一顾。认为一个脚本也没有太多的难度,那似乎为不懂程序的人专门设计的东西,不值得真正搞开发的去研究和应用。

从LiveScript 到JavaScript,在大量的时间JS都只是作为一种Script脚本在应用。更多的开发者只有在前端表单验证、以及诸如应用飘浮、移动、下拉联动菜单等网页特效或者必须通过界面才能得到的东西,比如客户端的时间、分辨率、以及一些在当前窗口操作的事件时才用得到它。于是JavaScript成了网页特效语言,专门用来给页面加上各种酷炫的效果了。JS似乎只能做些华而不实界面效果,甚至用户还可以随时屏蔽,一些浏览器工具条自动把 JavaScript给屏蔽了……

程序员对JavaScript的不重视,直接导致了JavaScript被忽视;而大量互联网特效应用,加速了JS被地当作一种脚本。而直到Jesse James Garrett 把JavaScript XMLhttp DOM等组合在一起正式提出Ajax后,JavaScript才忽然地炙手可热起来。加上Google、Yahoo、Microsoft等大型公司在Ajax方面的大量应用,JavaScript随着Ajax也越来越受到关注。

Ajax是一种新瓶装老酒的技术组合,或者说Ajax不是一种技术,而是一种概念。可正是这种能给互联网应用带来革新的概念让大家产生浓厚兴趣,原因不仅在于技术组合本身,也在于互联网应用技术模式的发展趋势。RIA的发展趋势需要新的技术和方法来配合,Ajax在现阶段正好满足了丰富互联网应用的部分发展要求,而重新利用上和定位JavaScript将是一种较好实现 RIA的选择。Ajax(或者说目前最佳丰富互联网技术应用)中真正的核心应当是JavaScript,目前的趋势是需要用JavaScript这种程序语言来重构网页、用JavaScript来格式化数据。而XMLhttp是一种传输数据的桥梁和协议,与原来GET和POST相类似,而XMLhttp很好地为JavaScript服务罢了。

实际上JavaScript就像 世界上最被误解的语言(http://www.crockford.com/javascript/javascript.html)里描述的JavaScript是世界上使用人数最多的编程语言之一,除了后缀是-script让人起疑之外,其他各种计算、流程控制、数组、函数一应俱全,与Java、C等等也很像。

当然也会程序员说,JavaScript不能操作文本(操作本地也不安全)、无法生成图像、也没有面向对象、没有类、没有继承、无法Debug,无法通过网络传输数据。所以,JavaScript不是一门真正意义上的程序语言。于是这样JavaScript就被忽略为在仅在页面设计当中使用的脚本了。但是,当看到JSON这样面向对象的JS应用、JS集合、3D图形、Prototype里类和继承,再加上XMLhttp异步传递网络数据,这时候还能说JavaScirpt仅仅是简单的脚本吗?

几年前就有先见者指明JavaScript是世界上最被误解的语言,幸好,今天我们已经认识到JS的重要性,不会一直再误会下去。

看到诸如
http://www.netvibes.com/
http://developer.yahoo.com/yui/
http://www.backbase.com/
http://www.meebo.com/
http://www.miniajax.com/
http://www.protopage.com/

http://www.google.com/
http://www.a9.com/
http://www.live.com/
http://www.snap.com/
http//www.ask.com/
http://dojotoolkit.org/
http://www.ask.com/

这些应用时,JavaScript就不会只是被当成脚本语言了。JavaScript具有面向对象的概念,也可以继承类和抛出异常。正因为这些,也就是现下为何Ajax框架层出不穷,并且如此火爆的原因了。程序开发者已经意识到JavaScript语言的重要性,以及重新认识它之后给网页开发带来的变革,对于无论是前端还是后台开发人员,JavaScript都不只是从前所认为的那样—–只是简单的脚本。

在一个项目当中,尤其网页开发项目,JavaScript几乎是必不可少的语言,它不要编译器,也不需要专门的解析器。只要客户端机器上有浏览器,只要把开源的JavaScript 引擎加入浏览器中(几乎所有的浏览器都支持,所有的电脑都有浏览器 ),不管是电脑还是手机,JavaScript都将很好地被支持。

而使用JavaScript,至少有下面这几点好处:
1,增加交互动态应用,丰富界面应用,提高用户体验
2,节省后台开发成本,减少后台开发量, 显示HTML/XHTML和格式化数据交给JS处理
3,节省网络带宽,让浏览速度更快,减轻服务器压力,XMLhttp 减少刷新数据
4,体现RIA,B/S模式的利器,通过JS可以达到C/S模式的效果
5,WEB版软件最好的界面实现者,Flash,Applet也还不错,不过目前JavaScrip是最好的
6,……

浏览器的兼容性或者用户屏蔽JS虽然是个头疼的问题,但绝大多数浏览器都在遵循ECMAScript1.5标准,大多数用户是不会禁用JS的,因为关闭JS使用互联网几乎是件困难的事。

虽然还有安全、开发和维护成本等等的不利因素在里面,但如果把JavaScript很好地与后台结合起来,JavaScript将是网页开发非常重要的一门语言,甚至不亚于Java。现在利用Java、php做后台的网站越来越多,而再有效结合JavaScript,利用JavaScript来t处理和显示页面,这样,丰富互联网应用、提高用户体验将成为可能。

JavaScript被程序员忽视这么久后,终于踏着RIA的步伐迎来了春天,不管怎么说,软件程序从桌面走向网络、走向浏览器将是必然的趋势。不是说要取代桌面应用,而是丰富互联网应用有太多的路要走。

而其中,桌面还是互联网应用其后台是很类似的,都可以用Java,C,C#等等。而在前台,在互联网软件应用上,JavaScript将会很好地担任界面开发程序语言的角色。

毕竟,JavaScript不再仅仅是脚本,而是一门可以面向对象的程序语言。当然了,要想真正利用好JavaSript这门语言,精通一门后台语言必不可少,而也只有这样JavaScript才不会是仅仅是脚本。

这里我说了大量JavaScript有利的一面,当然JS依然存在着这样那样的问题,但我想RIA发展是个趋势,B/S模式也是一个趋势,JavaScript也还在一直向前发展(新的版本也在研究)。我相信随着WEB2.0这种用户与网站以及用户之间的彼此交互应用越来越多,也随着网络带宽越来越快,RIA将会有一个很好的发展,而JavaScript在RIA中也将发挥越来越重要的作用。

Read: 731

ASP,PHP与.NET伪造HTTP-REFERER方法及防止伪造REFERER方法探讨

HTTP-REFERER这个变量已经越来越不可靠了,完全就是可以伪造出来的东东。

以下是伪造方法:

ASP:

dim http
set http=server.createobject("MSXML2.XMLHTTP") ‘//MSXML2.serverXMLHTTP也可以
Http.open "GET",url,false
Http.setRequestHeader "Referer","http://www.dc9.cn/"
Http.send()

PHP(前提是装了curl):

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, "http://www.dc9.cn/xxx.asp");
curl_setopt ($ch, CURLOPT_REFERER, "http://www.dc9.cn/");
curl_exec ($ch);
curl_close ($ch);

PHP(不装curl用sock)

$server = ‘www.dc9.cn’;
$host     = ‘www.dc9.cn’;
$target   = ‘/xxx.asp’;
$referer = ‘http://www.dc9.cn/’;     // Referer
$port     = 80;
$fp = fsockopen($server, $port, $errno, $errstr, 30);
if (!$fp)
{
    echo "$errstr ($errno)<br />n";
}
else
{
         $out = "GET $target HTTP/1.1rn";
         $out .= "Host: $hostrn";
         $out .= "Cookie: ASPSESSIONIDSQTBQSDA=DFCAPKLBBFICDAFMHNKIGKEGrn";
         $out .= "Referer: $refererrn";
         $out .= "Connection: Closernrn";
         fwrite($fp, $out);
         while (!feof($fp))
         {
                 echo fgets($fp, 128);
         }
         fclose($fp);
}

VB.NET/C#.NET

Dim oXMLHttp As MSXML2.XMLHTTP30 = New MSXML2.XMLHTTP30()
或者
MSXML2.XMLHTTP30 oXMLHttp = new MSXML2.XMLHTTP30();
oXMLHttp.open(….
oXMLHttp.setRequestHeader(…
oXMLHttp.send(..

javascript

xmlHttp.setRequestHeader("Referer", "http://URL");//???呵呵~假的~
JS不支持^_^

原理都是sock构造http头来senddata。其他语言什么的比如perl也可以,

目前比较简单的防御伪造referer的方法是用验证码(Session)。

现在有一些能防盗链软件的商业公司比如UUDOG,linkgate,VirtualWall什么的,都是开发的应用于IIS上面的dll。
有的是采用cookies验证、线程控制,有的是能随机生成文件名然后做URL重写。有的方法能的确达到不错的效果.

不过道高一尺,魔高一丈,这些雕虫小技终归是有破解方法的。

Read: 169

Hash 算法及其应用

什么是 Hash
Hash 的重要特性
Hash 函数的实现
主要的 Hash 算法
Hash 算法的安全问题
Hash 算法的应用
结 论

Hash, 一般翻译做“散列”,也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不 同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。

数学表述为:h = H(M) ,其中H( )–单向散列函数,M–任意长度明文,h–固定长度散列值。

在信息安全领域中应用的Hash算法,还需要满足其他关键特性:

第 一当然是单向性(one-way),从预映射,能够简单迅速的得到散列值,而在计算上不可能构造一个预映射,使其散列结果等于某个特定的散列值,即构造相 应的M=H-1(h)不可行。这样,散列值就能在统计上唯一的表征输入值,因此,密码学上的 Hash 又被称为"消息摘要(message digest)",就是要求能方便的将"消息"进行"摘要",但在"摘要"中无法得到比"摘要"本身更多的关于"消息"的信息。

第二是抗 冲突性(collision-resistant),即在统计上无法产生2个散列值相同的预映射。给定M,计算上无法找到M’,满足H(M)=H(M’) ,此谓弱抗冲突性;计算上也难以寻找一对任意的M和M’,使满足H(M)=H(M’) ,此谓强抗冲突性。要求"强抗冲突性"主要是为了防范所谓"生日攻击(birthday attack)",在一个10人的团体中,你能找到和你生日相同的人的概率是2.4%,而在同一团体中,有2人生日相同的概率是11.7%。类似的,当预 映射的空间很大的情况下,算法必须有足够的强度来保证不能轻易找到"相同生日"的人。

第三是映射分布均匀性和差分分布均匀性,散列结果 中,为 0 的 bit 和为 1 的 bit ,其总数应该大致相等;输入中一个 bit 的变化,散列结果中将有一半以上的 bit 改变,这又叫做"雪崩效应(avalanche effect)";要实现使散列结果中出现 1bit 的变化,则输入中至少有一半以上的 bit 必须发生变化。其实质是必须使输入中每一个 bit 的信息,尽量均匀的反映到输出的每一个 bit 上去;输出中的每一个 bit,都是输入中尽可能多 bit 的信息一起作用的结果。

Damgard 和 Merkle 定义了所谓“压缩函数(compression function)”,就是将一个固定长度输入,变换成较短的固定长度的输出,这对密码学实践上 Hash 函数的设计产生了很大的影响。Hash函数就是被设计为基于通过特定压缩函数的不断重复“压缩”输入的分组和前一次压缩处理的结果的过程,直到整个消息都 被压缩完毕,最后的输出作为整个消息的散列值。尽管还缺乏严格的证明,但绝大多数业界的研究者都同意,如果压缩函数是安全的,那么以上述形式散列任意长度 的消息也将是安全的。这就是所谓 Damgard/Merkle 结构:

在下图中,任意长度的消息被分拆成符合压缩函数输入要求的分组, 最后一个分组可能需要在末尾添上特定的填充字节,这些分组将被顺序处理,除了第一个消息分组将与散列初始化值一起作为压缩函数的输入外,当前分组将和前一 个分组的压缩函数输出一起被作为这一次压缩的输入,而其输出又将被作为下一个分组压缩函数输入的一部分,直到最后一个压缩函数的输出,将被作为整个消息散 列的结果。

MD5 和 SHA1 可以说是目前应用最广泛的Hash算法,而它们都是以 MD4 为基础设计的。

1) MD4
MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年设计的,MD 是 Message Digest 的缩写。它适用在32位字长的处理器上用高速软件实现–它是基于 32 位操作数的位操作来实现的。它的安全性不像RSA那样基于数学假设,尽管 Den Boer、Bosselaers 和 Dobbertin 很快就用分析和差分成功的攻击了它3轮变换中的 2 轮,证明了它并不像期望的那样安全,但它的整个算法并没有真正被破解过,Rivest 也很快进行了改进。

下面是一些MD4散列结果的例子:

MD4 ("") = 31d6cfe0d16ae931b73c59d7e0c089c0
MD4 ("a") = bde52cb31de33e46245e05fbdbd6fb24
MD4 ("abc") = a448017aaf21d8525fc10ae87aa6729d
MD4 ("message digest") = d9130a8164549fe818874806e1c7014b
MD4 ("abcdefghijklmnopqrstuvwxyz") = d79e1c308aa5bbcdeea8ed63df412da9
MD4 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = 043f8582f241db351ce627e153e7f0e4
MD4 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = e33b4ddc9c38f2199c3e7b164fcc0536

2) MD5
MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。它较MD4所做的改进是:

1) 加入了第四轮
2) 每一步都有唯一的加法常数;
3) 第二轮中的G函数从((X ∧ Y) ∨ (X ∧ Z) ∨ (Y ∧ Z)) 变为 ((X ∧ Z) ∨ (Y ∧ ~Z))以减小其对称性;
4) 每一步都加入了前一步的结果,以加快"雪崩效应";
5) 改变了第2轮和第3轮中访问输入子分组的顺序,减小了形式的相似程度;
6) 近似优化了每轮的循环左移位移量,以期加快"雪崩效应",各轮的循环左移都不同。
尽管MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好。

消 息首先被拆成若干个512位的分组,其中最后512位一个分组是“消息尾+填充字节(100…0)+64 位消息长度”,以确保对于不同长度的消息,该分组不相同。64位消息长度的限制导致了MD5安全的输入长度必须小于264bit,因为大于64位的长度信 息将被忽略。而4个32位寄存器字初始化为A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210, 它们将始终参与运算并形成最终的散列结果。

接着各个512位消息分组以16个32位字的形式进入算法的主循环,512位消息分组的个数据决定了循环的次数。主循环有4轮,每轮分别用到了非线性函数

F(X, Y, Z) = (X ∧ Y) ∨ (~X ∧ Z)
G(X, Y, Z) = (X ∧ Z) ∨ (Y ∧ ~Z)
H(X, Y, Z) =X +Y + Z
I(X, Y, Z) = X + (Y ∨ ~Z)
这4 轮变换是对进入主循环的512位消息分组的16个32位字分别进行如下操作:将A、B、C、D的副本a、b、c、d中的3个经F、G、H、I运算后的结果 与第4个相加,再加上32位字和一个32位字的加法常数,并将所得之值循环左移若干位,最后将所得结果加上a、b、c、d之一,并回送至ABCD,由此完 成一次循环。

所用的加法常数由这样一张表T来定义,其中i为1…64,T是i的正弦绝对值之4294967296次方的整数部分,这样做是为了通过正弦函数和幂函数来进一步消除变换中的线性性。

当所有512位分组都运算完毕后,ABCD的级联将被输出为MD5散列的结果。下面是一些MD5散列结果的例子:

MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = d174ab98d277d9f5a5611c2c9f419d9f
MD5 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = 57edf4a22be3c955ac49da2e2107b67a
参考相应RFC文档可以得到MD4、MD5算法的详细描述和算法的C源代码。

3) SHA1 及其他
SHA1是由NIST NSA设计为同DSA一起使用的,访问http://www.itl.nist.gov/fipspubs可以得到它的详细规范–"FIPS PUB 180-1 SECURE HASH STANDARD"。它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1 设计时基于和MD4相同原理,并且模仿了该算法。因为它将产生160bit的散列值,因此它有5个参与运算的32位寄存器字,消息分组和填充方式与MD5 相同,主循环也同样是4轮,但每轮进行20次操作,非线性运算、移位和加法运算也与MD5类似,但非线性函数、加法常数和循环左移操作的设计有一些区别, 可以参考上面提到的规范来了解这些细节。下面是一些SHA1散列结果的例子:

SHA1 ("abc") = a9993e36 4706816a ba3e2571 7850c26c 9cd0d89d
SHA1 ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 84983e44 1c3bd26e baae4aa1 f95129e5 e54670f1
其 他一些知名的Hash算法还有MD2、N-Hash、RIPE-MD、HAVAL等等。上面提到的这些都属于"纯"Hash算法。还有另2类Hash算 法,一类就是基于对称分组算法的单向散列算法,典型的例子是基于DES的所谓Davies-Meyer算法,另外还有经IDEA改进的Davies- Meyer算法,它们两者目前都被认为是安全的算法。另一类是基于模运算/离散对数的,也就是基于公开密钥算法的,但因为其运算开销太大,而缺乏很好的应 用前景。

没有通过分析和差分攻击考验的算法,大多都已经夭折在实验室里了,因此,如果目前流行的Hash算法能完全符合 密码学意义上的单向性和抗冲突性,就保证了只有穷举,才是破坏Hash运算安全特性的唯一方法。为了对抗弱抗冲突性,我们可能要穷举个数和散列值空间长度 一样大的输入,即尝试2128或2160个不同的输入,目前一台高档个人电脑可能需要1025年才能完成这一艰巨的工作,即使是最高端的并行系统,这也不 是在几千年里的干得完的事。而因为"生日攻击"有效的降低了需要穷举的空间,将其降低为大约1.2*264或1.2*280,所以,强抗冲突性是决定 Hash算法安全性的关键。

在NIST新的 Advanced Encryption Standard (AES)中,使用了长度为128、192、256bit 的密钥,因此相应的设计了 SHA256、SHA384、SHA512,它们将提供更好的安全性。

Hash算法在信息安全方面的应用主要体现在以下的3个方面:

1) 文件校验
我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。

MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。它常被用在下面的2种情况下:

第 一是文件传送后的校验,将得到的目标文件计算 md5 checksum,与源文件的md5 checksum 比对,由两者 md5 checksum 的一致性,可以从统计上保证2个文件的每一个码元也是完全相同的。这可以检验文件传输过程中是否出现错误,更重要的是可以保证文件在传输过程中未被恶意篡 改。一个很典型的应用是ftp服务,用户可以用来保证多次断点续传,特别是从镜像站点下载的文件的正确性。

更出色的解决方法是所谓的代码 签名,文件的提供者在提供文件的同时,提供对文件Hash值用自己的代码签名密钥进行数字签名的值,及自己的代码签名证书。文件的接受者不仅能验证文件的 完整性,还可以依据自己对证书签发者和证书拥有者的信任程度,决定是否接受该文件。浏览器在下载运行插件和java小程序时,使用的就是这样的模式。

第 二是用作保存二进制文件系统的数字指纹,以便检测文件系统是否未经允许的被修改。不少系统管理/系统安全软件都提供这一文件系统完整性评估的功能,在系统 初始安装完毕后,建立对文件系统的基础校验和数据库,因为散列校验和的长度很小,它们可以方便的被存放在容量很小的存储介质上。此后,可以定期或根据需 要,再次计算文件系统的校验和,一旦发现与原来保存的值有不匹配,说明该文件已经被非法修改,或者是被病毒感染,或者被木马程序替代。TripWire就 提供了一个此类应用的典型例子。

更完美的方法是使用"MAC"。"MAC" 是一个与Hash密切相关的名词,即信息鉴权码(Message Authority Code)。它是与密钥相关的Hash值,必须拥有该密钥才能检验该Hash值。文件系统的数字指纹也许会被保存在不可信任的介质上,只对拥有该密钥者提 供可鉴别性。并且在文件的数字指纹有可能需要被修改的情况下,只有密钥的拥有者可以计算出新的散列值,而企图破坏文件完整性者却不能得逞。

2) 数字签名
Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。

在这种签名协议中,双方必须事先协商好双方都支持的Hash函数和签名算法。

签名方先对该数据文件进行计算其散列值,然后再对很短的散列值结果–如Md5是16个字节,SHA1是20字节,用非对称算法进行数字签名操作。对方在验证签名时,也是先对该数据文件进行计算其散列值,然后再用非对称算法验证数字签名。

对 Hash 值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点:

首先,数据文件本身可以同它的散列值分开保存,签名验证也可以脱离数据文件本身的存在而进行。

再 者,有些情况下签名密钥可能与解密密钥是同一个,也就是说,如果对一个数据文件签名,与对其进行非对称的解密操作是相同的操作,这是相当危险的,恶意的破 坏者可能将一个试图骗你将其解密的文件,充当一个要求你签名的文件发送给你。因此,在对任何数据文件进行数字签名时,只有对其Hash值进行签名才是安全 的。

3) 鉴权协议
如下的鉴权协议又被称作"挑战–认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。

需 要鉴权的一方,向将被鉴权的一方发送随机串(“挑战”),被鉴权方将该随机串和自己的鉴权口令字一起进行 Hash 运算后,返还鉴权方,鉴权方将收到的Hash值与在己端用该随机串和对方的鉴权口令字进行 Hash 运算的结果相比较(“认证”),如相同,则可在统计上认为对方拥有该口令字,即通过鉴权。

POP3协议中就有这一应用的典型例子:

S: +OK POP3 server ready <1896.697170952@dbc.mtview.ca.us>
C: APOP mrose c4c9334bac560ecc979e58001b3e22fb
S: +OK maildrop has 1 message (369 octets)
在 上面的一段POP3协议会话中,双方都共享的对称密钥(鉴权口令字)是tanstaaf,服务器发出的挑战是< 1896.697170952@dbc.mtview.ca.us>,客户端对挑战的应答是MD5("< 1896.697170952@dbc.mtview.ca.us>tanstaaf") = c4c9334bac560ecc979e58001b3e22fb,这个正确的应答使其通过了认证。

散列算法长期以来一直在计算机科学中大量应用,随着现代密码学的发展,单向散列函数已经成为信息安全领域中一个重要的结构模块,我们有理由深入研究其设计理论和应用方法。

(金诺 · Panzer)

Read: 651