package com.hao.util.password; import com.hao.util.password.codec.Base64; import com.hao.util.password.codec.Hex; import com.hao.util.password.codec.Utf8; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * Created by user on 2016/4/19. */ public class ShaEncoder { private final String algorithm; private int iterations = 1; private boolean encodeHashAsBase64 = false; public ShaEncoder(int strength) { this("SHA-" + strength); } public ShaEncoder(String algorithm) { this(algorithm,false); } public ShaEncoder(String algorithm,boolean encodeHashAsBase64) { this.algorithm = algorithm; setEncodeHashAsBase64(encodeHashAsBase64); getMessageDigst(); } private final MessageDigest getMessageDigst() throws IllegalArgumentException{ try { return MessageDigest.getInstance(algorithm); } catch (NoSuchAlgorithmException e) { throw new IllegalArgumentException("No such algorithm [" + algorithm + "]"); } } public void setEncodeHashAsBase64(boolean encodeHashAsBase64) { this.encodeHashAsBase64 = encodeHashAsBase64; } public boolean isEncodeHashAsBase64() { return encodeHashAsBase64; } public String encodePassword(String rawPass, Object salt) { String saltedPass = mergePasswordAndSalt(rawPass,salt,false); MessageDigest messageDigest = getMessageDigst(); byte[] digest = messageDigest.digest(Utf8.encode(saltedPass)); for (int i = 0; i < iterations; i++) { digest = messageDigest.digest(digest); } if (isEncodeHashAsBase64()) { return Utf8.decode(Base64.encode(digest)); } else { return new String(Hex.encode(digest)); } } public String mergePasswordAndSalt(String password,Object salt,boolean strict) { if (password == null) { password = ""; } if (strict && (salt != null)) { if ((salt.toString().lastIndexOf("{") != -1) || (salt.toString().lastIndexOf("}") != -1)) { throw new IllegalArgumentException("can not use { or } in salt.toString()"); } } if ((salt == null) || "".equals(salt)) { return password; }else { return password + "(^_^)" + salt.toString(); } } }