用java实现 wordpress的密码加密

用java实现 wordpress的密码加密

这几天在研究wordpress的登录问题,由于密码他不是直接md5,所以在这里卡了一下,由于不想让所有的用户都修改密码,所以就只有用java来解决wordpress的密码加密问题了


我们查看数据库可以发现,wordpress的密码形式分为了3部分,如下面的密码

$P$B12345678ababababababababababab

第一段:$P$格式固定 
第二段:只有一个字符。若php版本大于5.0则为B,否则为9 
第三段:8位salt (随机数)
第四段:22位,真正加密后的密码 


使用java实现wordpress的密码加密,他的大概意思(步骤)是:

1,获得一个hash ,是一个byte[]类型。这个hash是明文密码(pass)和salt的md5加密

2,将明文密码转换为byte[]

3,运行2的13次方循环,即8192次循环,循环内容如下

    3.1,创建一个新的byte[],我们叫他为newbyte,他的长度是上面1和2两个长度之和

    3.2,将上面1的数组(也就是hash)复制到这个新的newbyte

    3.3,将上面2的数组(明文密码转换的byte[])继续复制到这个新的newbyte

    3.4,将这个新的数组进行一次md5计算,得到一个新值,把这个值给hash

    3.5,如此循环,也就是说每次新的newbyte,他的前面部分是变化的,后面部分没有没有

4,最终得到一个新的newhash1,与0xff进行与运算

5,最后返回我们最终的密码


return "$P$B" + salt + encode64(x, 16);
以下为详细代码(以下代码来自网络,经过测试,完全可行),根据我上面的解释,相信大家一定可以很好的理解的。



package springMVC.NLoveB.test;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class wordpass {
	
	public static String WordpressEncrypt(String str, String salt) {
		MessageDigest md;
		try {
			md = MessageDigest.getInstance("MD5");
			byte[] hash = md.digest((salt + str).getBytes());
			byte[] palin = str.getBytes();		//密码
			for (int i = 0; i < 8192; i++) {
				byte[] newplain = new byte[hash.length + palin.length];
				/*
				 * 要复制的数组;从那里开始复制;复制到那个数组;从那里开始;复制多长
				 */
				System.arraycopy(hash, 0, newplain, 0, hash.length);
				System.arraycopy(palin, 0, newplain, hash.length, palin.length);
				//md5加密
				MessageDigest md5 = MessageDigest.getInstance("MD5");
				//digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
				//BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
				hash = md5.digest(newplain);
			}
			int[] x = new int[hash.length];
			for (int i = 0; i < hash.length; i++) {
				x[i] = hash[i] & 0xff;
				//	System.out.println(re);		
				//	return re;
			}
			return "$P$B" + salt + encode64(x, 16);
			//return String.valueOf(hash.length);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return "fail";
		}
	}

	private static String encode64(int[] input, int number) {
		String hash = "";
		int output = 0;
		int[] input_2 = new int[number];
		for (int i = 0; i < number; i++) {
			input_2[i] = input[i];
			//text_2.Text += "'" + input_2[i] + "'" ;
		}
		String itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
		int output_2 = 0;
		int len_2 = 0;
		int value_2 = 0;
		for (int i = 0; i < number; i++) {
			int value = input_2[i];
			output = input_2[i];
			hash += itoa64.substring((value % 64 + 64) % 64, (value % 64 + 64) % 64 + 1);
			if (i + 1 <= number) {
				if (i + 1 < number) {
					value = input_2[++i];
					output_2 = (value << 8);		//左移8位
					output = output + output_2;
				}
				value_2 = output;
				int len = Integer.toBinaryString(output).length();
				if (len - 6 > 0) {
					output = (output >> 6);			//右移6位
				} else {
					output = 0;
				}
				value = output;
				hash += itoa64.substring((value % 64 + 64) % 64, (value % 64 + 64) % 64 + 1);
			} else {
				break;
			}
			if (i + 1 < number) {
				value = input_2[++i];
				output_2 = (value << 16);			//左移16位
				output = value_2 + output_2;
				value_2 = output;
				len_2 = Integer.toBinaryString(output).length();
				output_2 = output;
				output = (output >> 12);			//右移12位
				value = output;
				hash += itoa64.substring((value % 64 + 64) % 64, (value % 64 + 64) % 64 + 1);
			} else {
				break;
			}
			if (i + 1 < number) {
				len_2 = Integer.toBinaryString(output_2).length();
				output = (output_2 >> 18);			//右移18位
				value = output;
				hash += itoa64.substring((value % 64 + 64) % 64, (value % 64 + 64) % 64 + 1);
			}
		}
		return hash;
	}

	public static void main(String[] args) throws NoSuchAlgorithmException {
		System.out.println(WordpressEncrypt("zheshimima","suijishu"));

	}

}



爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情Blog Img