字符串到字节数组,然后到Java中的MD5

时间:2011-10-28 14:34:10

标签: java hex md5

在过去的5个小时内,我试图做一些非常简单的事情并在C#中用10分钟完成,但是没有运气的Java。 我有一个32 UpperCase和Numeric String(A-Z0-9),我需要将这个String转换为Dec,然后md5它。 我的问题是我没有未编码的字节,所以我不能md5我的数组:\

以下是我在python中需要做的事情:

salt = words[1].decode("hex")
passwordHash = generatePasswordHash(salt, pw)
generatePasswordHash(salt, password):
    m = md5.new()
    m.update(salt)
    m.update(password)
    return m.digest()

这里是C#:

public static string GeneratePasswordHash(byte[] a_bSalt, string strData) {
    MD5 md5Hasher = MD5.Create();

    byte[] a_bCombined = new byte[a_bSalt.Length + strData.Length];
    a_bSalt.CopyTo(a_bCombined, 0);
    Encoding.Default.GetBytes(strData).CopyTo(a_bCombined, a_bSalt.Length);

    byte[] a_bHash = md5Hasher.ComputeHash(a_bCombined);

    StringBuilder sbStringifyHash = new StringBuilder();
    for (int i = 0; i < a_bHash.Length; i++) {
        sbStringifyHash.Append(a_bHash[i].ToString("X2"));
    }

    return sbStringifyHash.ToString();
}

protected byte[] HashToByteArray(string strHexString) {
    byte[] a_bReturn = new byte[strHexString.Length / 2];

    for (int i = 0; i < a_bReturn.Length; i++) {
        a_bReturn[i] = Convert.ToByte(strHexString.Substring(i * 2, 2), 16);
    }

    return a_bReturn;
}

我很乐意得到这方面的帮助:)

3 个答案:

答案 0 :(得分:8)

将十六进制字符串解析为一个字节:(byte) Integer.parseInt(s, 16)

要使用默认编码将密码字符串转换为字节数组(我建议不要这样做:始终指定特定的编码):password.getBytes()(或password.getBytes(encoding)用于特定编码)。

散列字节数组:MessageDigest.getInstance("MD5").digest(byte[])

将字节转换为十六进制字符串:请参阅In Java, how do I convert a byte array to a string of hex digits while keeping leading zeros?

答案 1 :(得分:2)

我相信以下内容可行:

// convert your hex string to bytes
BigInteger bigInt = new BigInteger(salt, 16);
byte[] bytes = bigInt.toByteArray();
// get the MD5 digest library
MessageDigest md5Digest = null;
try {
    md5Digest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
    // error handling here...
}
// by default big integer outputs a 0 sign byte if the first bit is set
if (bigInt.testBit(0)) {
    md5Digest.update(bytes, 1, bytes.length - 1);
} else {
    md5Digest.update(bytes);
}
// get the digest bytes
byte[] digestBytes = md5Digest.digest();

以下是将十六进制字符串转换为byte[]数组的更多提示:

答案 2 :(得分:0)

您可以在java中使用无符号数字并应用位掩码。详细了解here