MD5:严格来说不算加密算法,只能说是摘要算法;
MD5用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法)
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式
它是一种密码散列函数,可以产生出一个 128 位的散列值。它是单向的加密算法,明文可以变成密文,但是通过密文无法解密成明文,一般用于验证数据的准确性,以及信息传输的完整性。
对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
在MD5算法中,首先需要对信息进行填充,使其字节长度对512求余的结果等于448。因此,信息的字节长度(Bits Length)将被扩展至N512+448,即N64+56个字节(Bytes),N为一个正整数。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,如今信息字节长度=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。(可参见MD5算法词条)摘录于百度百科。
MD5的Java实现
import java.security.MessageDigest;
public class testMD5 {
public static void main(String[] args) {
System.out.println(md5Encoder("abc"));
}
public static String md5Encoder(String inStr){
MessageDigest md5 =null;
try {
md5 = MessageDigest.getInstance("MD5");
//对字符串加密
md5.update(inStr.getBytes("UTF-8"));
}catch (Exception e){
System.out.println(e.toString());
e.printStackTrace();
return null;
}
//获得加密后的字符串
byte[] md5Bytes = md5.digest();
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i <md5Bytes.length ; i++) {
//toHexString方法是把字节以16进制方式显示,八位(bit)是一个字节(byte),参数类型应为int,&0xff是为了保留后八位
//该方法转后八位为16进制,得到了两个16进制的值
String hex = Integer.toHexString(0xff & md5Bytes[i]);
//如果不够两位16进制数要补0
if (hex.length() == 1){
stringBuffer.append('0');
}
stringBuffer.append(hex);
}
return stringBuffer.toString();
}
}
SHA加密
SHA是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆 的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也 称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明文的数字签名。
该算法输入报文的长度不限,产生的输出是一个160位的报文摘要。
通过散列算法可实现数字签名实现,数字签名的原理是将要传送的明文通过一种函数运算(Hash)转换成报文摘要(不同的明文对应不同的报文摘要),报文摘要加密后与明文一起传送给接受方,接受方将接受的明文产生新的报文摘要与发送方的发来报文摘要解密比较,比较结果一致表示明文未被改动,如果不一致表示明文已被篡改。
Java中SHA实现和MD5类似,只需改动创建实例的MD5为SHA;即可生成40位的SHA码。
对于强行攻击和密码分析的安全性,SHA都要强于MD5,但SHA的速度要比MD5低。