用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/天,具体规则查看活动详情