import java.security.MessageDigest;

public class PasswordEncoder {

private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5",

"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };

private Object salt;

private String algorithm;

public PasswordEncoder(Object salt, String algorithm) {

this.salt = salt;

this.algorithm = algorithm;

}

public String encode(String rawPass) {

String result = null;

try {

MessageDigest md = MessageDigest.getInstance(algorithm);

//加密后的字符串

result = byteArrayToHexString(md.digest(mergePasswordAndSalt(rawPass).getBytes("utf-8")));

} catch (Exception ex) {

}

return result;

}

public boolean isPasswordValid(String encPass, String rawPass) {

String pass1 = "" + encPass;

String pass2 = encode(rawPass);

return pass1.equals(pass2);

}

private String mergePasswordAndSalt(String password) {

if (password == null) {

password = "";

}

if ((salt == null) || "".equals(salt)) {

return password;

} else {

return password + "{" + salt.toString() + "}";

}

}

/**

* 转换字节数组为16进制字串

* @param b 字节数组

* @return 16进制字串

*/

private static String byteArrayToHexString(byte[] b) {

StringBuffer resultSb = new StringBuffer();

for (int i = 0; i < b.length; i++) {

resultSb.append(byteToHexString(b[i]));

}

return resultSb.toString();

}

private static String byteToHexString(byte b) {

int n = b;

if (n < 0)

n = 256 + n;

int d1 = n / 16;

int d2 = n % 16;

return hexDigits[d1] + hexDigits[d2];

}

public static void main(String[] args) {

String salt = "helloworld";

PasswordEncoder encoderMd5 = new PasswordEncoder(salt, "MD5");

String encode = encoderMd5.encode("test");

System.out.println(encode);

boolean passwordValid = encoderMd5.isPasswordValid("1bd98ed329aebc7b2f89424b5a38926e", "test");

System.out.println(passwordValid);

PasswordEncoder encoderSha = new PasswordEncoder(salt, "SHA");

String pass2 = encoderSha.encode("test");

System.out.println(pass2);

boolean passwordValid2 = encoderSha.isPasswordValid("1bd98ed329aebc7b2f89424b5a38926e", "test");

System.out.println(passwordValid2);

}

}

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐