什么是MD5
MD5加密全程是Message-Digest Algoorithm 5(信息-摘要算法),它对信息进行摘要采集,再通过一定的位运算,最终获取加密后的MD5字符串。
例如我们要加密一篇文章,那么我们会随机从每段话或者每行中获取一个字,把这些字统计出来后,再通过一定的运算获得一个固定长度的MD5加密后信息。因此,其很难被逆向破解。
MD5有哪些特点
针对不同长度待加密的数据、字符串等等,其都可以返回一个固定长度的MD5加密字符串。(通常32位的16进制字符串);
其加密过程几乎不可逆,除非维护一个庞大的Key-Value数据库来进行碰撞破解,否则几乎无法解开。
运算简便,且可实现方式多样,通过一定的处理方式也可以避免碰撞算法的破解。
对于一个固定的字符串。数字等等,MD5加密后的字符串是固定的,也就是说不管MD5加密多少次,都是同样的结果。
Java MD5加密方式
1.JDK自带MessageDigest
public class MD5Util { public static String getMD5Str(String str) { byte[] digest = null; try { MessageDigest md5 = MessageDigest.getInstance("md5"); digest = md5.digest(str.getBytes("utf-8")); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } //16是表示转换为16进制数 String md5Str = new BigInteger(1, digest).toString(16); return md5Str; } }
JDK自带MessageDigest优点:
可以加密多种算法如:MD5,SHA,SHA1,SHA-224,SHA-256,SHA-384,SHA-512
JDK自带MessageDigest缺点:
缺点代码语句较多,不方便
2.使用Spring的DigestUtils工具类
import org.springframework.util.DigestUtils; //32位,小写 String md532Lower = DigestUtils.md5DigestAsHex("adcdefg".getBytes()); //32位,大写 String md532Upper=md532Lower.toUpperCase(); //16位,小写 String md516Lower =md532Lower.substring(8, 24); //16位,大写 String md516Upper=md532Lower.substring(8, 24).toUpperCase();
Spring的DigestUtils工具类的优点:
方便,代码简洁
Spring的DigestUtils工具类的缺点:
缺点只可进行MD5加密
3.借助apache工具类DigestUtils
所需jar包:commons-codec.jar,maven pom.xml包如下:
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.10</version> </dependency>
/** * MD5加密之方法一 * @explain 借助apache工具类DigestUtils实现 * @param str * 待加密字符串 * @return 16进制加密字符串 */ public static String encryptToMD5(String str) { return DigestUtils.md5Hex(str); }
apache工具类DigestUtils优点:
代码简洁,缺点,只能MD5加密
apache工具类DigestUtils缺点:
额外引用maven依赖或手动导入jar
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》