原创

用Java验证wordpress生成的密码

一、wordpress密码加密后的密文格式:

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

二、密文的加密方法

php版本高于5.0
$hash = md5($salt.$password, TRUE); do { $hash = md5($hash.$password, TRUE); } while (--$count);
[注]“.”在php中是连接运算参数TRUR表示加密结果取16位二进制,count取2的13次方:8192,php版本低于5.0
$hash = pack('H*', md5($salt.$password)); do { $hash = pack('H*', md5($hash.$password)); } while (--$count);
[注]php低于5.0 md5返回的是32位十六进制字符串形式,pack(H*) 将md5结果转化为二进制,count取2的11次方:2048,上述方法得到的 $hash 再进行base64加密:

三、wordpress的base64算法

64位字符表比较特殊,与普通的字符表顺序有差异:
 itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; //input即hash,count=16

java实现加密

package cn.liuhaihua.core.util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class WPPasswordUtil { //wordpress 加密 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"); 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) { // TODO Auto-generated catch block 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) { // 示例使用 String plainPassword = "123344"; String hashedPassword = "$P$Bsu1fS5Gh72dYtsDPIRbGNn0Ec5X5x."; System.out.println(WordpressEncrypt(plainPassword, hashedPassword.substring(4,12))); /*// WordPress 哈希密码 // 生成盐 String salt = BCrypt.gensalt(8); System.out.println("Hashed Password: " + BCrypt.hashpw(plainPassword,salt)); // 验证密码 boolean isPasswordCorrect = BCrypt.checkpw(plainPassword, hashedPassword); System.out.println("Password is correct: " + isPasswordCorrect);*/ } }
//调用加密然后和库里面的密码比较
WPPasswordUtil.WordpressEncrypt(pwd, member_db.getUserPass().substring(4,12)).equals(member_db.getUserPass())
正文到此结束
Loading...