/*******************************************************************************
* Copyright [2015] [Onboard team of SERC, Peking University]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package com.onboard.service.account.utils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
import org.springframework.security.authentication.encoding.PasswordEncoder;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import com.google.common.base.Preconditions;
/**
* Created by luoruici on 13-12-12.
*/
public class PasswordUtils {
public static final PasswordEncoder encoder = new Md5PasswordEncoder();
public static final BCryptPasswordEncoder digester = new BCryptPasswordEncoder();
/**
* MD5加密密码后再用bcrypt加密
*
* @param password
* @return
*/
public static String createPassword(String rawPass, String salt) {
Preconditions.checkNotNull(rawPass);
String oldPW = createMD5Password(rawPass);
return updateOldEncPass(oldPW, salt);
}
/**
* 验证密码是否有效
*
* @param encPass
* 加密密码
* @param rawPass
* 原始密码
* @return
*/
public static boolean isPasswordValid(String encPass, String rawPass, String salt) {
Preconditions.checkNotNull(encPass);
Preconditions.checkNotNull(rawPass);
String oldPW = createMD5Password(rawPass);
return digester.matches(addSalt(oldPW, salt), encPass);
// return encoder.isPasswordValid(encPass.toLowerCase(), rawPass, null);
}
/**
* 原有加密策略,MD5 hash后大写
*
* @param rawPass
* @return
*/
private static String createMD5Password(String rawPass) {
return encoder.encodePassword(rawPass, null).toUpperCase();
}
/**
* 在原有密码基础上加密
*
* @param oldPW
* @param salt
* @return
*/
public static String updateOldEncPass(String oldPW, String salt) {
return digester.encode(addSalt(oldPW, salt));
}
/**
*
* @param level
* 加密强度
* @return
*/
public static BCryptPasswordEncoder getBcryptDigestByLevel(int level) {
if (level <= 0)
return new BCryptPasswordEncoder();
else
return new BCryptPasswordEncoder(level);
}
/**
* implement our own salt adding using created time
*
* @param origin
* @param salt
* @return
*/
public static String addSalt(String origin, String salt) {
Pattern p = Pattern.compile("\\d{2}:\\d{2}:\\d{2}");
Matcher m = p.matcher(salt);
if (m.find() != true)
assert (false);
return origin + revertString(m.group().replaceFirst(":", "-"));
}
private static String revertString(String s) {
if (s == null || s.length() == 0)
return "";
else {
return (new StringBuffer(s)).reverse().toString();
}
}
}