如何在Java中执行MySQL UNHEX()函数

我正在尝试从字符串中获取Java密码哈希值,所以我搜索了一下,发现MySQL中的PASSWORD()是如何工作的:

SELECT SHA1(UNHEX(SHA1('test')));

给出了相同的结果

SELECT PASSWORD('test');

有了这个,我继续说.

我写了一个方法将字符串转换为SHA1 Hash,它完美地工作(测试了几个不同的字符串,获得与MySQL中的SHA1(str)相同的结果)

接下来要做的是UNHEX()方法.我现在卡住了.

我目前的方法:

public static String toMySQLPasswordHash(String str)
{
    String hash1 = toSHA1Hash(str);
    String unhexedHash1 = new String(DatatypeConverter.parseHexBinary(hash1));
    String hash2 = toSHA1Hash(unhexedHash1);

    String passwordHash = "*" + hash2.toUpperCase();


    return passwordHash;
}

我的“toSHA1Hash”方法:

public static String toSHA1Hash(String str)
{
    MessageDigest md = null;

    try
    {
        md = MessageDigest.getInstance("SHA-1");
    }
    catch (NoSuchAlgorithmException e)
    {
        Logger.WriteLog(e.toString());
    }

    if (md == null)
        return null;


    md.reset();
    md.update(str.getBytes());

    byte[] byteData = md.digest();
    StringBuilder sb = new StringBuilder();

    for (byte currByte : byteData)
        sb.append(Integer.toString((currByte & 0xff) + 0x100, 16).substring(1));

    return sb.toString();
}

我不喜欢使用任何外部软件包,所以请帮助我只使用JDK 1.8.0_40.

解决方法:

我设法通过改变我的toSH1Hash方法得到正确的哈希(感谢Hanno Binder).

我现在使用的方法:

public static String toSHA1Hash(byte[] stringAsBytearray)
{
    MessageDigest md = null;

    try
    {
        md = MessageDigest.getInstance("SHA-1");
    }
    catch (NoSuchAlgorithmException e)
    {
        Logger.WriteLog(e.toString());
    }

    if (md == null)
        return null;


    md.reset();
    md.update(stringAsBytearray);

    byte[] byteData = md.digest();
    StringBuilder sb = new StringBuilder();

    for (byte currByte : byteData)
        sb.append(Integer.toString((currByte & 0xff) + 0x100, 16).substring(1));

    return sb.toString();
}

public static String toSHA1Hash(String str)
{
    return toSHA1Hash(str.getBytes());
}

public static String toMySQLPasswordHash(String str)
{
    String hash1 = toSHA1Hash(str);
    byte[] unhexedHash1 = DatatypeConverter.parseHexBinary(hash1);
    String hash2 = toSHA1Hash(unhexedHash1);

    String passwordHash = "*" + hash2.toUpperCase();


    return passwordHash;
}
上一篇:AtCoder Beginner Contest 208


下一篇:AtCoder Beginner Contest 210