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