package org.zhangmz.pickles.modules.utils;

import org.zhangmz.pickles.modules.vo.HashPasswordResult;

/**
 * 
 * @ClassName:DiscuzHashPassword 
 * @Description:Discuz密码操作类
 * @author:张孟志
 * @date:2016年1月20日 上午9:35:08 
 * @version V1.0
 * 说明：实现Discuz密码操作，为数据迁移做准备
 * 
 *      uc_client/model/user.php  function add_user
 *      $password = md5(md5($password).$salt);
 *      存储到数据库中的用户密码的加密方式：用户输入的密码经过md5加密，后面跟上一段字符串$salt之后，再md5加密一次。
 *      $salt = substr(uniqid(rand()), -6);
 *      可以分析为从后面往前截取6个字符。
 *      那么discuz存储密码的方式就得到了：用户输入密码md5加密后，在连接上6个随机字符然后md5加密一次。
 *      其中，md5加密为  32位（小）
 *      
 *      查看数据库表 pre_ucenter_members  有password.salt
 *      里面有一个 salt字段。这个字段即是后面跟的那个随机数。
 *      即当插入用户的时候，生成的那个随机数。而且用户登陆的时候，验证用的随机数，也是这个。
 */
public class DiscuzHashPassword {
	
	/**
	 * 
	 * @Title: getHashPassword 
	 * @Description: 获取加密后的hashpassword
	 * @param input
	 * @param salt
	 * @return
	 * @throws 
	 * 增加人:张孟志
	 * 增加日期:2016年1月23日 上午7:46:58
	 * 说明：根据用户输入的密码、数据库保存的salt，计算加密后的hashpassword
	 */
	public static String getHashPassword(String input, String salt) {
		HashPasswordResult result = getHashPasswordResult(input, salt);
		return result.getHashPassword();
	}
	
	/**
	 * 
	 * @Title: getHashPasswordResult 
	 * @Description: 获取加密后对象
	 * @param input
	 * @return
	 * @throws 
	 * 增加人:张孟志
	 * 增加日期:2016年1月23日 上午7:49:44
	 * 说明：该方法获取原始加密后对象，设置salt为null，加密过程随机产生salt。
	 */
	public static HashPasswordResult getHashPasswordResult(String input) {
		return getHashPasswordResult(input, null);
	}
	
	/**
	 * 
	 * @Title: getHashPasswordResult 
	 * @Description: 获取加密后对象
	 * @param input
	 * @param salt
	 * @return
	 * @throws 
	 * 增加人:张孟志
	 * 增加日期:2016年1月23日 上午7:50:32
	 * 说明：加密后产生了加密salt、hashPassword，封装在HashPasswordResult
	 */
	private static HashPasswordResult getHashPasswordResult(String input, String salt) {
		HashPasswordResult result = new HashPasswordResult();
		
		// 兼顾密码生成（即使产生salt）与密码检验(salt已保存在数据库中)
		result.setSalt(salt);
		if(null == salt){ result.setSalt(Md5Util.getRandomString(6));}

		String passwordMd5 = Md5Util.getMd5(input);		
		result.setHashPassword(Md5Util.getMd5(passwordMd5 + result.getSalt()));
		
		return result;
	}
}



@@ -269,21 +269,94 @@
 %E6%8D%AE%E8%BF%81%E7%A7%BB%E5%81%9A%E5%87%86%E5%A4%87%0D%0A
+ * %09%09DiscuzHashPassword%E5%AF%B9%E5%8E%9F%E5%A7%8B%E5%AF%86%E7%A0%81%E5%8A%A0%E5%AF%86%0D%0A * %09%09DiscuzHashMd5Password%E5%AF%B9%E5%B7%B2MD5%E5%8A%A0%E5%AF%86%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8A%A0%E5%AF%86%0D%0A
  * %0D%0A
-
  *      
@@ -1242,24 +1242,241 @@
 (input, salt
+, false);%0D%0A%09%09return result.getHashPassword();%0D%0A%09%7D%09%0D%0A%0D%0A%09public static String getHashPassword(String input, String salt, boolean isMd5Input) %7B%0D%0A%09%09HashPasswordResult result = getHashPasswordResult(input, salt, isMd5Input
 );%0D%0A%09%09return
@@ -1842,16 +1842,180 @@
 ut, null
+, false);%0D%0A%09%7D%0D%0A%0D%0A%09public static HashPasswordResult getHashPasswordResult(String input, boolean isMd5Input) %7B%0D%0A%09%09return getHashPasswordResult(input, null, isMd5Input
 );%0D%0A%09%7D%0D%0A
@@ -2119,32 +2119,55 @@
  * @param salt%0D%0A
+%09 * @param isMd5Input%0D%0A
 %09 * @return%0D%0A%09 *
@@ -2357,32 +2357,52 @@
 put, String salt
+, boolean isMd5Input
 ) %7B%0D%0A%09%09HashPassw
@@ -2443,24 +2443,54 @@
 dResult();%0D%0A
+%09%09String passwordMd5 = null;%0D%0A
 %09%09%0D%0A%09%09// %E5%85%BC%E9%A1%BE%E5%AF%86
@@ -2614,31 +2614,79 @@
 (6));%7D%0D%0A%0D%0A%09%09
-String 
+if(isMd5Input)%7B%0D%0A%09%09%09passwordMd5 = input;%0D%0A%09%09%7Delse%7B%0D%0A%09%09%09
 passwordMd5 
@@ -2709,16 +2709,23 @@
 (input);
+%0D%0A%09%09%7D%0D%0A
 %09%09%0D%0A%09%09re

重构加密算法。