是否有任何PHP等效的JAVA SecretKeyFactory来创建登录系统?

时间:2014-06-07 10:12:43

标签: java php mysql sha1 salt

(这是我在这里的第一篇文章。)

我正在编写一个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)但它似乎有所不同。

0 个答案:

没有答案