我正在跟危险漫步学习PHP脚本语言,就想能不能用PHP也来实现计算字符串和文件的MD5和SHAl散列的功能。在PHP帮助手册的帮助下我用一晚上的时间做到了。
PHP编写的程序有两种,一种是在命令行下运行,一种是在Web空间中用Apache、IIS等Webark务器软件运行,为了更方便传递要计算散列的字符串或要计算散列的文件的文件名,我决定编写在命令行下运行的PHP程序。
其实用PHP来计算MD5和SHA1散列还是很简单的,PHP有计算MD5和SHA1散列的对应内置函数,只需要调用相应的函数就行了。计算字符串的MD5和SHA1散列的函数和计算文件的MD5和SHA1散列的函数不是一个,共需要用到4个内置函数。计算字符串的MD5散列的内置函数是md5(),计算文件的MD5散列的内置函数是md5_file();计算字符串的SHA1散列的内置函数是sha1(),计算文件的SHA1散列的内置函数是sha1_file()。因为计算字符串的散列的函数和计算文件的散列的函数不是同一个,先要通过参数告诉程序是计算字符串的MD5和SHA1散列还是计算文件的MD5和SHA1散列,如果参数是s就是计算字符串的MD5和SHA1散列,如果参数是f还是计算字符串的MD5和SHA1散列。要计算MD5和SHA1散列的字符串文件用另一个参数来传递给程序。PHP程序的参数保存在数组argv[]中,argv[0]是第一个参数,它的值是PHP文件的文件名;argv[1]是第二个参数,用来接收是计算字符串的MD5和SHA1散列还是计算文件的MD5和SHA1散列的参数s或f;argv[2]是第三个参数,用来接收要计算MD5和SHA1散列的字符串或文件的文件名(可以带文件所在的目录)。
要运行这个程序,需要系统中安装PHP,我的系统中已经安装好了PHP,PHP版本为PHP 5.3.8。打开命令提示符,切换到C盘根目录下,输入“php md5sha1.php”后回车就可以看到程序的使用说明了。我已经把php.exe所在的目录加进了系统环境变量中,因此不用输入php.exe所在的目录。
先来计算下字符串的MD5和SHA1散列。输入“php md5sha1.php s hackerxfiles”,回车,计算出了字符串hackerxfiles的MD5散列4273F14A9184FBA9E52CC1716086C9A2和SHA1散列62860C160C1F1B64ADB5F0153C04120521E55FC6。
再来计算下文件的MD5和SHA1散列。就来计算我写的md5sha1.php这个文件的MD5和SHA1散列。在命令行下输入“php md5sha1.php f md5sha1.php”,回车,计算出了文件md5sha1.php的MD5散列B4CBC8533A8E20C5689777E714BC4CD5和SHA1散列B5BD77458D3F4CD3152DA95D0834915397EC261C,计算出的散列结果是否正确呢?我们来验证下。用计算文件散列的小工具Hash来计算文件md5sha1.php的MD5和SHA1散列,发现计算结果和我的PHP程序计算出的结果完全相同。
来计算下中文目录下文件名是中文的文件的MD5和SHA1散列。我在C盘根目录下新建了一个名为测试的目录,把putty.exe复制到测试目录下,重命名为测试.exe。在命令行下输入“php md5sha1.phpf C:\测试\测试.exe”回车后计算出的测试.exe的MD5散列为9BB6826905965C13BEIC84CC0FF83F42,SHA1散列为AE7734E7A54353AB13ECBA780ED62344332FBC6F,和Hash计算出的结果完全相同。说明程序在计算文件的MD5和SHA1散列时支持中文目录和中文文件名。
其实真要计算字符串和文件的MD5和SHA1散列,用图形界面下的工具可能更方便使用,但是,利用PHP编写的程序也能实现这个功能,就是命令行下的,易用性有所欠缺。