Created
April 23, 2020 07:52
-
-
Save xinlc/8aee549292752b6ad410df16ebc24601 to your computer and use it in GitHub Desktop.
Md5Utils
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import org.apache.commons.codec.binary.Hex; | |
import java.security.MessageDigest; | |
import java.util.Random; | |
public class Md5Utils { | |
/** | |
* 加盐MD5加密 | |
* <p> | |
* | |
* @Title : getSaltMD5 | |
* </p> | |
* <p> | |
* @Description : TODO | |
* </p> | |
*/ | |
public static String getSaltMD5(String password) { | |
// 生成一个16位的随机数 | |
Random random = new Random(); | |
StringBuilder sBuilder = new StringBuilder(16); | |
sBuilder.append(random.nextInt(99999999)).append(random.nextInt(99999999)); | |
int len = sBuilder.length(); | |
if (len < 16) { | |
for (int i = 0; i < 16 - len; i++) { | |
sBuilder.append("0"); | |
} | |
} | |
// 生成最终的加密盐 | |
String Salt = sBuilder.toString(); | |
password = md5Hex(password + Salt); | |
char[] cs = new char[48]; | |
for (int i = 0; i < 48; i += 3) { | |
cs[i] = password.charAt(i / 3 * 2); | |
char c = Salt.charAt(i / 3); | |
cs[i + 1] = c; | |
cs[i + 2] = password.charAt(i / 3 * 2 + 1); | |
} | |
return String.valueOf(cs); | |
} | |
/** | |
* 使用Apache的Hex类实现Hex(16进制字符串和)和字节数组的互转 | |
* <p> | |
* | |
* @Title : md5Hex | |
* </p> | |
* <p> | |
* @Description : TODO | |
* </p> | |
*/ | |
// @SuppressWarnings("unused") | |
private static String md5Hex(String str) { | |
try { | |
MessageDigest md = MessageDigest.getInstance("MD5"); | |
byte[] digest = md.digest(str.getBytes()); | |
return new String(new Hex().encode(digest)); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
System.out.println(e.toString()); | |
return ""; | |
} | |
} | |
/** | |
* 验证加盐后密码是否还相同 | |
* @param password | |
* @param md5str | |
* @return | |
*/ | |
public static boolean getSaltverifyMD5(String password, String md5str) { | |
char[] cs1 = new char[32]; | |
char[] cs2 = new char[16]; | |
for (int i = 0; i < 48; i += 3) { | |
cs1[i / 3 * 2] = md5str.charAt(i); | |
cs1[i / 3 * 2 + 1] = md5str.charAt(i + 2); | |
cs2[i / 3] = md5str.charAt(i + 1); | |
} | |
String Salt = new String(cs2); | |
return md5Hex(password + Salt).equals(String.valueOf(cs1)); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import lombok.extern.slf4j.Slf4j; | |
import org.apache.commons.codec.binary.Hex; | |
import org.junit.runner.RunWith; | |
import org.springframework.boot.test.context.SpringBootTest; | |
import org.springframework.test.context.junit4.SpringRunner; | |
import java.security.MessageDigest; | |
import java.security.NoSuchAlgorithmException; | |
import java.util.Random; | |
//@Slf4j | |
//@RunWith(SpringRunner.class) | |
//@SpringBootTest | |
public class DemoApplicationTests { | |
public static String MD5(String input) { | |
MessageDigest md5 = null; | |
try { | |
md5 = MessageDigest.getInstance("MD5"); | |
} catch (NoSuchAlgorithmException e) { | |
return "check jdk"; | |
} catch (Exception e) { | |
e.printStackTrace(); | |
return ""; | |
} | |
char[] charArray = input.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 generate(String password) { | |
Random r = new Random(); | |
StringBuilder sb = new StringBuilder(16); | |
sb.append(r.nextInt(99999999)).append(r.nextInt(99999999)); | |
int len = sb.length(); | |
if (len < 16) { | |
for (int i = 0; i < 16 - len; i++) { | |
sb.append("0"); | |
} | |
} | |
String salt = sb.toString(); | |
password = md5Hex(password + salt); | |
char[] cs = new char[48]; | |
for (int i = 0; i < 48; i += 3) { | |
cs[i] = password.charAt(i / 3 * 2); | |
char c = salt.charAt(i / 3); | |
cs[i + 1] = c; | |
cs[i + 2] = password.charAt(i / 3 * 2 + 1); | |
} | |
return new String(cs); | |
} | |
public static boolean verify(String password, String md5) { | |
char[] cs1 = new char[32]; | |
char[] cs2 = new char[16]; | |
for (int i = 0; i < 48; i += 3) { | |
cs1[i / 3 * 2] = md5.charAt(i); | |
cs1[i / 3 * 2 + 1] = md5.charAt(i + 2); | |
cs2[i / 3] = md5.charAt(i + 1); | |
} | |
String salt = new String(cs2); | |
return md5Hex(password + salt).equals(new String(cs1)); | |
} | |
private static String md5Hex(String src) { | |
try { | |
MessageDigest md5 = MessageDigest.getInstance("MD5"); | |
byte[] bs = md5.digest(src.getBytes()); | |
return new String(new Hex().encode(bs)); | |
} catch (Exception e) { | |
return null; | |
} | |
} | |
public static void main(String args[]) { | |
String plaintext = "LeoXin"; | |
System.out.println("明文:" + plaintext); | |
System.out.println("普通MD5码:" + MD5(plaintext)); | |
// 获取加盐后的MD5值 | |
String ciphertext = generate(plaintext); | |
System.out.println("加盐后MD5码:" + ciphertext); | |
System.out.println("是否是同一字符串:" + verify(plaintext, ciphertext)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment