자바 MD5 소금 암호 화 알고리즘 구현
현재 일반적인 MD5 암호 화 는 인터넷 에서 마음대로 복호화 할 수 있 습 니 다.복호화 하 는 사 이 트 는 다음 과 같 습 니 다.
http://pmd5.com/
http://www.cmd5.com/
http://tool.chinaz.com/tools/md5.aspx
데 이 터 는 MD5 암호 화 를 통 해 위의 도 구 를 통 해 쉽게 복호화 할 수 있 지만 암호 의 안전성 을 높이 기 위해 자바 로 MD5 의 무 작위 소금 암호 화 를 실현 할 수 있 습 니 다.그러면 복호화 하기 어렵 습 니 다.원래 의 비밀 번 호 를 사용 해 야 정상 적 인 로그 인 시스템 을 만 들 수 있 습 니 다.다음은 자바 가 실현 하 는 MD5 무 작위 소금 암호 화 입 니 다.그리고 Apache 의 Hex 클래스 를 사용 하여 Hex(16 진수 문자열 과)와 바이트 배열 의 상호 전환 을 실현 합 니 다.
MD5Utils 도구 클래스:
package com.etc.cls.img.main.utils;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;
import org.apache.commons.codec.binary.Hex;
/**
* MD5
*
*
* @ClassName : PassWordUtils
*
*
* @Description : TODO
*
*
* @Author : HuaZai
*
*
* @ContactInformation : [email protected]/[email protected]
*
*
* @Date : 2017 12 26 2:44:14
*
*
*
* @Version : V1.0.0
*
*
*/
public class MD5Utils {
/**
* MD5 01
*
*
* @Title : getStrMD5
*
*
* @Description : TODO
*
*
* @Author : HuaZai
*
*
* @Date : 2017 12 26 2:49:44
*
*/
public static String getStrMD5(String inStr) {
// MD5
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
System.out.println(e.toString());
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[] digest = md5.digest(byteArray);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < digest.length; i++) {
int var = digest[i] & 0xff;
if (var < 16)
sb.append("0");
sb.append(Integer.toHexString(var));
}
return sb.toString();
}
/**
* MD5 02
*
*
* @Title : getStrrMD5
*
*
* @Description : TODO
*
*
* @Author : HuaZai
*
*
* @Date : 2017 12 27 11:18:39
*
*/
public static String getStrrMD5(String password) {
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
try {
byte strTemp[] = password.getBytes("UTF-8");
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(strTemp);
byte md[] = mdTemp.digest();
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 15];
str[k++] = hexDigits[byte0 & 15];
}
return new String(str);
} catch (Exception e) {
return null;
}
}
/**
* MD5
*
*
* @Title : getconvertMD5
*
*
* @Description : TODO
*
*
* @Author : HuaZai
*
*
* @Date : 2017 12 26 3:34:17
*
*/
public static String getconvertMD5(String inStr) {
char[] charArray = inStr.toCharArray();
for (int i = 0; i < charArray.length; i++) {
charArray[i] = (char) (charArray[i] ^ 't');
}
String str = String.valueOf(charArray);
return str;
}
/**
* Apache Hex Hex(16 )
*
*
* @Title : md5Hex
*
*
* @Description : TODO
*
*
* @Author : HuaZai
*
*
* @Date : 2017 12 27 11:28:25
*
*/
@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 "";
}
}
/**
* MD5
*
*
* @Title : getSaltMD5
*
*
* @Description : TODO
*
*
* @Author : HuaZai
*
*
* @Date : 2017 12 27 11:21:00
*
*/
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);
}
/**
*
*
*
* @Title : verifyMD5
*
*
* @Description : TODO
*
*
* @Author : HuaZai
*
*
* @Date : 2017 12 27 2:22:22
*
*/
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));
}
} 프로그램 입구:
package com.etc.cls.img.main;
import com.etc.cls.img.main.utils.MD5Utils;
/**
*
*
*
* @ClassName : ClsMain
*
*
* @Description : TODO
*
*
* @Author : HuaZai
*
*
* @ContactInformation : [email protected]/[email protected]
*
*
* @Date : 2017 12 20 4:37:54
*
*
*
* @Version : V1.0.0
*
*
*/
public class ClsMain {
@SuppressWarnings("static-access")
public static void main(String[] args) {
MD5Utils md = new MD5Utils();
String strMD5 = new String("12345");
System.out.println(" :" + strMD5);
System.out.println(" :" + md.getStrrMD5(strMD5));
System.out.println("MD5 :" + md.getStrMD5(strMD5));
System.out.println(" :" + md.getconvertMD5(strMD5));
System.out.println(" :" + md.getconvertMD5(md.getconvertMD5(strMD5)));
System.out.println("\t\t=======================================");
//
String plaintext = "huazai";
// plaintext = "123456";
System.out.println(" :" + plaintext);
System.out.println(" MD5 :" + MD5Utils.getStrMD5(plaintext));
// MD5
String ciphertext = MD5Utils.getSaltMD5(plaintext);
System.out.println(" MD5:" + ciphertext);
System.out.println(" :" + MD5Utils.getSaltverifyMD5(plaintext, ciphertext));
/**
* DingSai MD5
*/
String[] tempSalt = { "810e1ee9ee5e28188658f431451a29c2d81048de6a108e8a",
"66db82d9da2e35c95416471a147d12e46925d38e1185c043",
"61a718e4c15d914504a41d95230087a51816632183732b5a" };
for (String temp : tempSalt) {
System.out.println(" :" + MD5Utils.getSaltverifyMD5(plaintext, temp));
}
}
} Apache 의 Hex 클래스 를 사용 하여 Hex(16 진수 문자열 과)와 바이트 배열 의 상호 전환 에 필요 한 Jar 패 키 지 를 다운로드 합 니 다.
commons-codec-1.11 CSDN 다운로드
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.