【问题标题】:Convert C++ md5 encode to android/java将 C++ md5 编码转换为 android/java
【发布时间】:2016-01-31 11:04:56
【问题描述】:

我想把下面的方法转换成java。我不想自己实现它。但我没有得到预期的编码字符串。代码如下:

QString CHMacMD5::MD5_encode(QString password) {
    unsigned char result[16];
    memset( result, 0, sizeof(result) );
    QString md5key = "some_key";
    CHMacMD5 md5;
    md5.HMac_MD5(password.toUtf8().constData(),password.length(),md5key.toUtf8().constData(),md5key.length(),result);
    QString md5out;
    for( int i = 0; i < 16; ++i ) {
        md5out += QString("%1").arg(result[i], 2, 16, QChar('0'));
    }
    return md5out;
}

我猜想在 java 字符串转换为 UTF-8、无符号字节等之间发生了一些事情。

这是我的java代码:

 private void md5Encode(String password) {
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("MD5");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
        return;
    }

    md.update(javaStringToNullTerminatedString(password));

    byte[] digest = md.digest();

    StringBuffer sb = new StringBuffer();
    for (byte b : digest) {
        sb.append(String.format("%02x", b & 0xff));
    }

    System.out.println("original:" + password);
    System.out.println("digested(hex):" + sb.toString());
 }

private byte[] javaStringToNullTerminatedString(String string) {
    CharsetEncoder enc = Charset.forName("ISO-8859-1").newEncoder();

    int len = string.length();
    byte b[] = new byte[len + 1];
    ByteBuffer bbuf = ByteBuffer.wrap(b);
    enc.encode(CharBuffer.wrap(string), bbuf, true);

    b[len] = 0;

    return b;
}

【问题讨论】:

  • 您只显示了您要转换的代码,而不是您所说的无法正常工作的 java 代码。

标签: java android c++ qt md5


【解决方案1】:

原始代码不是计算普通的 MD5 校验和,而是使用变量 md5key 中的密钥和输入密码的消息验证码。

您的代码仅计算密码的 md5 哈希值,根本不使用密钥。

密钥和输入文本的组合到 MD5(或其他散列函数)的输入的获取 hmac 由 RFC 2104 指定: https://www.ietf.org/rfc/rfc2104.txt

这里(第二个答案)似乎是如何在 Java 中做到这一点: How to Generate HMAC MD5 In Android?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2016-04-14
    • 2014-05-27
    • 2015-09-27
    • 1970-01-01
    相关资源
    最近更新 更多