晚上,阅文集团笔试考到了MD5加密。
在Java中,如果要实现MD5加密算法,可以采用java.security.MessageDigest。
JDK
使用java.security.MessageDigest实现
1 | public String getMD5(String str) { |
Spring DigestUtils
在spring-core-xxx.RELEASE.jar中,有一个类叫作org.springframework.util.DigestUtils,它有一个方法md5DigestAsHex,它封装了java.security.MessageDigest的相关操作。
使用它,我们可以轻松实现MD5加密,并返回长度为32的16进制密文。
1 | String secret = md5DigestAsHex("hegongshan".getBytes()); |
其源码如下:
1 | public static String md5DigestAsHex(byte[] bytes) { |
1.声明MD5_ALGORITHM_NAME的源码如下:
1 | private static final String MD5_ALGORITHM_NAME = "MD5"; |
2.digestAsHexString的源码如下:
1 | private static String digestAsHexString(String algorithm, byte[] bytes) { |
3.char[] hexDigest = digestAsHexChars(algorithm, bytes)中的digestAsHexChars的源码如下:
1 | private static char[] digestAsHexChars(String algorithm, byte[] bytes) { |
4.digest方法用于获取java.security.MessageDigest,并为给定的数组bytes计算摘要。
1 | private static byte[] digest(String algorithm, byte[] bytes) { |
5.encodeHex方法用于将数组bytes(长度为16)转换为16进制字符串(长度为32)。
1 | private static final char[] HEX_CHARS = |
总结
若采用java.security.MessageDigest来实现MD5加密,则需要编写一些额外的代码,才能返回32位16进制字符串。
Spring DigestUtils对java.security.MessageDigest的方法进行了封装,在使用时,不需要编写额外的代码。
上述两种方式只对字符串进行了简单的加密,如果要实现更为复杂的加密,如加盐等,可以使用Apache Commons Codec。