常用的安全算法
常用的安全算法主要包括摘要算法、对称加密算法、非对称加密算法、信息编码等。将着重介绍各种算法的使用场景与使用方法,避免涉及密码学相关理论的枯燥无味的叙述。
1.数字摘要
数字摘要” 也称为消息摘要,它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash函数对消息进行计算而产生。如果消息在传递的途中改变了,接收者通过对收到的消息采用相同的Hash重新计算,新产生的摘要与原摘要进行比较,就可知道消息是否被篡改 J ' 因此消息摘要能够验证消息的完整性。消息摘要采用单向Hash函数,将需要计算的内容“摘要“ 成固定长度的串,这个串也称为数字指纹。这个串有固定的长度,且不同的明文摘要成密文,其结果总是不同的(相对的,这个后面会介绍),而同样的明文其摘要必定一 致。这样这串摘要便可成为验证明文是否是 “真身” 的 ”指纹” 了。
Hash碰撞
如果待摘要的关键字为k, Hash函数为 f(x), 则关键字k的摘要为 f (k), 若关键字kl不等于k2, 而f(kl) =f (k2), 这种现象称为Hash碰撞。
一 个 Hash 函数的好坏是由发生碰撞的概率决定的,如果攻击者能够轻易地构造出两个具有相同Hash值的消息,那么这样的Hash函数是很危险的。可以认为,摘要的长度越长,算法也就越安全。由于数字摘要并不包含原一的完整信息,因此,要从摘要信息逆向得出待摘要的明文串,原则上几乎是不可能完成的任务。
消息摘要的特点总结如下:
(1)无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。
(2) 一 般只要输入的消息不同,对其进行摘要以后产生的摘要消息也不相同,但相同的输入必会产生相同的输出。
(3)由于消息摘要并不包含原文的完整信息,因此只能进行正向的信息摘要,而无法从摘要中恢复出原来的消息,甚至根本就找不到任何与原信息相关的信息。
1.MD5
是数字摘要算法的一 种实现。确保信息传输完整性和一 致性,摘要长度为 128 位。M D5 巾M D4、M D3、M D2 改进而来,主要增强了算法复杂度和不可逆性。该算法因其普遍、稳定、快速的特点, 在产业界得到 了极为广泛的使用,目前主流的编程语言普遍都已有MD5算法的实现。
java提供的实现如下:
public static byte[] testMDS(String content)throws Exception{
MessageDigest md = MessageDigest.getinstance("MDS");
byte [] bytes=md.digest(content.getBytes("utf8"));
return bytes;
//通过MessageDigest取得MD5摘要算法的实例,然后通过digest方法进行MD5摘要。
//待摘要串:
hello,i am chenkangxian,good night!
//MDS算法生成的摘要串(十六进制编码后):
22bd33d4 c72dl 98 6ccb4 227 f f7 fle72 6
2.SHA
即安全散列算法。1993年,安全散列算法(SHA)山天国国家标汛和技术协会(NIST)提出.SHA-I是基于MD4算法的,现在已成为公认的最安全的散列算法之一,并被广泛使用。
SHA-l算法生成的摘要信息的长度为160位,由于生成的摘要信息更长,运算的过程更加复朵,在相同的硬件上,SHA-I的运行速度比MD5更慢,但是也更为安全。
//基于Java的SHA-I算法的使用:
public static byte[] testSHAl(String content)throws Exception{
MessageDigest md= MessageDigest.getlnstance("SHA-1");
byte[] bytes= md.digest(content.ge七Bytes("utf8"));
return bytes;
//deb945d3e6fe72dbla290bcfcf53057clcaafdel
同MOS符法的使用类似,SHA-I算法也是通过MessageDigest取得具摘要算法的实例,然后通过digest方法进行SHA-I摘要。
由于计算出的摘要转换成字符串,可能会生成一些无法显示和网络传输的控制字符,因此,需要对生成的摘要字符串进行编码,常用的编码方式包括十六进制编码与Base64编码。
3.十六进制编码
我们都知道,计算机的计算采用的是二进制的数据表示方法,而十六进制也是数据的一种表示方法,并且可以与二进制数据进行相互转化,每4位二进制数据对应一位十六进制数据。同我们日常使用的十进制表示法不同的是,十六进制由0 9和A F来进行表示,与十进制的对应关系是:0 9对应0 9,A F对应10 15。
每一个byt e包含8位二进制数据,由于Java中没有无符号整型,因此8位中有一位为符号位,需要将符号位转换为对应的数值,然后再转换为对应的十六进制。8位二进制可以转换为2位十六进制,不足2位的进行补O,而解码时,需要先将符号位进行还原,再对数值进行转换,使用了lnteger.parselnt(subStr,16)这个方法来对十六进制进行解析,将其转换为整型的数值,然们判断止负,计算出符号位,并将剩余的位还原为byte的数值。
4.Base64编码
Base6416是一种基千64个可打印字符来表示二进制数据的方法,由于2的6次方等于64,所以每6位为一个单元,对应某个可打印字符,三个字节有24位,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。在Base64中的可打印字符包括字母A z、a z、数字0-9, 这样共有62个字符,此外两个可打印符号在不同的系统中而不同。
JDK 中提供了sun.m isc.BASE64Encoder和sun.misc.BASE64Decoder两个很好的工具类,用它们可以非常方便地完成基于 Base64 的编码和解码。
- 彩虹表破解 Hash 算法
彩虹表 (Rainbow Table) 法”是一 种破解哈希算法的技术,从原理上来说能够对任何一 种Hash 算法进行攻击。简单地说,彩虹表就是一 张采用各种 Hash 算法生成的明文和密文的对照表,在彩虹表中,表内的每一 条记录都是一 串明文对应一 种 Hash 算法生成的一 串密文。 我们得到一 串加密字符,以及它采用的加密算法后,通过使用相关软件工具对彩虹表进行查找、比较、运算,能够迅速得出此加密字符串对应的明文,从而实现了对密文的破解
正因为彩虹表采用这种笨拙的方式,一一 穷举存储明文和密文的所有组合,所以彩虹表非常庞大,根据密文所对应明文的长度和复杂度(包含的字符类型:数字、字母、特殊字符等),常用到的彩虹表大小从几百MB到几十GB不等,当然,理论上彩虹的大小是可以无穷大的。
近年来,随着一 些大型网站的用户数据库的沦陷,所暴露出来的用户名及明文密码的组在各种黑客圈子里边流传,使得彩虹表的数据积累越来越丰富、越来越准确,并且随着计算机硬件技术的发展,也使得彩虹表法破解 Hash 算法的效率越来越高,对于Hash 算法来说,彩虾表法成为了一 种不可忽视的威胁。
摘自:
《大型分布式网站架构设计与实践》 阅读笔记