package com.fufan.mtsaas.tools;

//If Java version >= 8, java.util.Base64 is a better choice.

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 * @author XiaoSK E-mail:pub@tehon.org
 * Create Date：Jul 20, 2014 08:50:49 PM
 * Update Date：Jul 29, 2014 12:20:00 PM
 * 密码摘要类，供中介公司的员工和后台管理员生成和核验密文密码
 */
public class PasswordDigest implements PasswordEncoder {

    /**
     * 密码加密方法
     * 
     * @param rawPass, 用户输入的明文密码
     * @return 64字符长度
     */
    @Override
    public String encode(CharSequence rawPass) {
        // 别怕，BASE64只是第一步而已
        byte[] pwdBase64Arr = Base64.encodeBase64(rawPass.toString().getBytes());
        // 倒序一下
        ArrayUtils.reverse(pwdBase64Arr);
        // SHA512长摘要，超越彩虹表存储空间
        String pwd = DigestUtils.sha512Hex(new String(pwdBase64Arr));
        // 再倒序一下
        pwd = new StringBuffer(pwd).reverse().toString();
        // SHA256短摘要，返回一个彩虹表陷阱
        return DigestUtils.sha256Hex(pwd);
    }

    /**
     * 密码校验方法
     *
     * @param encPass, 从数据库读出的密码
     * @param rawPass, 用户输入的明文密码
     * @return 是否匹配true|false
     */
    @Override
    public boolean matches(CharSequence rawPass, String encPass) {
        return encPass.equals(encode(rawPass));
    }
}
