我使用相同的 MySQL 表来存储来自不同程序的密码。一种是用 Java 编写的,另一种是用 PHP 编写的。
我使用此脚本通过 PHP 保存密码:
encrypted_password= md5(md5('added_salt').md5(md5('plain_password')));
我需要像上面一样使用 MD5 和 salt 在 Java 中加密密码。我用 Java 编写代码,但它的输出不同:
MessageDigest md = MessageDigest.getInstance("MD5");
String salts = "a,d,d,e,d,_,s,a,l,t";
String salttmps[] = salts.split(",");
byte salt[] = new byte[salttmps.length];
for (int i = 0; i < salt.length; i++) {
salt[i] = Byte.parseByte(salttmps[i]);
}
md.update(salt);
md.update(password.getBytes());
byte byteData[] = md.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}
password = sb.toString();
我需要更正 Java 代码并生成与 PHP 相同的输出。
最佳答案
如果您可以在问题中发布输出示例,最好重现该算法。
我想你应该这样做:
public static void main(String[] args) {
try {
System.out.println(md5(md5("added_salt"), md5("plain_password")));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
public static String md5(String plainText) throws NoSuchAlgorithmException {
return md5(null, plainText);
}
public static String md5(String salt, String plainText)
throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("MD5");
if (salt != null) {
md.update(salt.getBytes());
}
md.update(plainText.getBytes());
byte byteData[] = md.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16)
.substring(1));
}
return sb.toString();
}
md5(md5("added_salt"), md5("plain_password"))
返回 3bd9e544ab1a3d3485f07af38cc1b415
关于java - Java 中使用 MD5 和 Salt 进行密码加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24160989/