您的位置:首页 > 编程语言 > Java开发

JAVA中MD5散列表加密与Spring中MD5 SHA加密比较

2014-11-26 17:37 323 查看
l MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法。

l SHA(Secure Hash Algorithm):可以对任意长度的数据运算生成一个160位的数值;

SHA-1

在1993年,安全散列算法(SHA)由美国国家标准和技术协会(NIST)提出,并作为联邦信息处理标准(FIPS PUB 180)公布;1995年又发布了一个修订版FIPS PUB 180-1,通常称之为SHA-1。SHA-1是基于MD4算法的,并且它的设计在很大程度上是模仿MD4的。现在已成为公认的最安全的散列算法之一,并被广泛使用。

MD5 与SHA-1 的比较

因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:

l 对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^128数量级的操作,而对SHA-1则是2^160数量级的操作。这样,SHA-1对强行攻击有更大的强度。

l 对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。

l 速度:在相同的硬件上,SHA-1的运行速度比MD5慢。

JAVA内置java.security.MessageDigest实现:

package com.redhamr.util;

import java.io.*;
import java.security.MessageDigest;

public class HashCrypt {
/***
* MD5加码 生成32位md5码
*/
public static String string2MD5(String inStr){
MessageDigest md5 = null;
try{
md5 = MessageDigest.getInstance("MD5");
}catch (Exception e){
System.out.println(e.toString());
e.printStackTrace();
return "";
}
char[] charArray = inStr.toCharArray();
byte[] byteArray = new byte[charArray.length];

for (int i = 0; i < charArray.length; i++)
byteArray[i] = (byte) charArray[i];
byte[] md5Bytes = md5.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++){
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16)
hexValue.append("0");
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();

}

/**
* 加密解密算法 执行一次加密,两次解密
*/
public static String convertMD5(String inStr){

char[] a = inStr.toCharArray();
for (int i = 0; i < a.length; i++){
a[i] = (char) (a[i] ^ 't');
}
String s = new String(a);
return s;

}

// 测试主函数
public static void main(String args[]) {
String s = new String("lcx123");
System.out.println("原始:" + s);
System.out.println("MD5后:" + string2MD5(s));
System.out.println("解密的:" + convertMD5(convertMD5(s)));
}

}


Spring中MD5是由org.springframework.security.authentication.encoding.Md5PasswordEncoder

而SHA是由org.springframework.security.authentication.encoding.ShaPasswordEncoder:

package com.esoft.core.util;

import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
import org.springframework.security.authentication.encoding.PasswordEncoder;
import org.springframework.security.authentication.encoding.ShaPasswordEncoder;

public class HashCrypt {
public static String SHA = "SHA";

public static String MD5 = "MD5";

private final static PasswordEncoder shaPasswordEncoder = new ShaPasswordEncoder();

private final static PasswordEncoder md5PasswordEncoder = new Md5PasswordEncoder();

public static String getDigestHash(String str) {
return getDigestHash(str, "SHA");
}

public static String getDigestHash(String str, String hashType) {
if (str == null)
return null;
return getDigestHash(str, hashType,null);
}

public static String getDigestHash(String str, String hashType,Object salt ) {
if(hashType == null){
hashType = SHA ;
}

if(hashType.equals(MD5)){
return md5PasswordEncoder.encodePassword(str, salt);
}

return shaPasswordEncoder.encodePassword(str, salt);
}

public static void main(String[] args) {
System.out.println( getDigestHash("jhsx128710104") );
}
}



空字符串:

sha("")= da39a3ee5e6b4b0d3255bfef95601890afd80709

md5("")=d41d8cd98f00b204e9800998ecf8427e
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: