加密散列函数的帮助下,很多工具软件都可以用来保证计算环境的安全。大部分加密散列函数的设计模式都采用了分块加密算法,针对输入的字符串,产生一个不同于输入内容的独有输出字符串。举例来说,如果你输入字符串“Keep it simple!”并获得“A”作为输出字符串,在这里真正有用的部分是输入其它字符串是都不可能将“A”作为输出字符串。
对于一个加密散列函数来说,输出部分的长度是固定的:无论多长的输入字符串,三个还是三百万个字符,输出字符串都将永远是相同的长度。如前所述,此输出字符串中只要改变一个输入字符就会产生不同的输出字符串(称为“散列”或“校验”)。此外,预测输出特定字符串是不可能的事情。
这些加密散列函数经常在很多方面被利用。通常情况下,它们可以用于密码验证领域。在文件下载领域,它们也经常出现,可以用来方便快速地确定下载的文件是否已经损坏,或者在传递的过程中被人加入了恶意附件。对于采用了OpenPGP工具的包含数字签名的电子邮件来说,散列的信息通常是意味着已经获得了“签名”,可以被其它用户认可。
在众所周知的加密散列函数中用最广泛的可能是MD5和SHA-1。在2005年,MD5和SHA-1中都被发现存在重大的缺陷。SHA-1属于SHA-0的加强版本,但SHA-0中存在的重大缺陷在SHA-1中还是存在的。由于很多人依然认为MD5和SHA-1是足够强大的,并且处于无处不在的使用环境中,所以甚至到今天它们也还是经常被使用。但更多的安全组织尽力选择了更强大的算法,举例来说,SHA-256就是一个不错的替代品,它似乎没有了困扰SHA-0和SHA-1的缺陷。
对于低优先级不需要进行鉴别的应用来说,使用MD5和SHA-1进行加密散列操作不存在任何问题,对于这种情况,通常我们熟悉的名称是“digests”。大多数类Unix操作系统都在默认核心工具包里包含了可以利用MD5和SHA-1进行散列创建和比较的工具。类似的工具也在苹果MacOS下、甚至微软Windows等商业操作系统中出现。而对于包括Perl、PHP、Python以及Ruby在内的大多数高级编程语言来说,这项功能已经被加入标准库中。
附加的数据库与常见的现代编程语言相比,可以提供功能更强大的加密散列函数。这里面不仅仅包括了上面提到的动态编程语言,象C、C++语言、Java和C#(以及其他类型的.NET语言)之类的低级和静态语言也被包括在内了。
在选择下载使用的软件时,你应该首先考虑采用了加密散列算法的对象,这样就会将可能带来的麻烦减少到最低的程度,并且有可能的话,你应该拒绝使用没有利用随处可见的散列工具进行校验的软件。
更重要的是,如果你属于软件和其它可能受到攻击和破坏的文件的提供者,没有任何理由不利用常见的加密散列工具提供良好的校验。一个简单的Perl或者Ruby脚本即可进行验证,并不需要利用C程序进行大量的编译,因为,它仅仅是人们肉眼可读的纯文本字符;但对于可执行二进制文件、jar文件以使用OpenOffice.org字处理软件产生的文件这样的更大、更复杂的文件和文件格式来说,应该始终使用以确保文件的绝对安全。
当然,加密散列函数不能保证下载的软件一定是可以安全使用的。它们能确保的是创建文件和散列的人是值得信赖的。