(这是我在这里的第一篇文章。)
我正在编写一个Minecraft服务器网站,我想要一个登录系统。 我的我的Minecraft服务器( BungeeCord )正在使用“ BungeeAuth ”来要求玩家为自己的帐户设置密码。
BungeeAuth的密码存储在我的Mysql服务器中,主要有两个主要版本:“ playername ”和“密码”。
我希望能够在我的网站上使用此密码登录。
密码经过哈希处理。我决定反编译“BungeeAuth”以了解它是如何工作的。
这是图书馆:
import java.math.BigInteger;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
这是代码:
public boolean validatePassword(String originalPassword, String storedPassword)
throws NoSuchAlgorithmException, InvalidKeySpecException {
String parts[] = storedPassword.split(":");
int iterations = Integer.parseInt(parts[0]);
byte salt[] = fromHex(parts[1]);
byte hash[] = fromHex(parts[2]);
PBEKeySpec spec = new PBEKeySpec(originalPassword.toCharArray(), salt, iterations, hash.length * 8);
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
byte testHash[] = skf.generateSecret(spec).getEncoded();
int diff = hash.length ^ testHash.length;
for (int i = 0; i < hash.length && i < testHash.length; i++) {
diff |= hash[i] ^ testHash[i];
}
return diff == 0;
}
private static byte[] fromHex(String hex)
throws NoSuchAlgorithmException {
byte bytes[] = new byte[hex.length() / 2];
for (int i = 0; i < bytes.length; i++) {
bytes[i] = (byte) Integer.parseInt(hex.substring(2 * i, 2 * i + 2), 16);
}
return bytes;
}
我理解盐是随机的,密码在 SHA1 ( PBKDF2WithHmacSHA1 )中加密。
PHP中是否有任何功能可以做同样的事情? 我已经尝试了 hash_hmac('sha1',...,$ salt)但它似乎有所不同。