gpt4 book ai didi

java - 将 C++ md5 编码转换为 android/java

转载 作者:行者123 更新时间:2023-11-30 05:32:25 25 4
gpt4 key购买 nike

我想将以下方法转换为 java.lang.我不想自己实现。但我没有得到预期的编码字符串。这是代码:

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;
}

最佳答案

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

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

将 key 和输入文本组合到 MD5(或其他哈希函数)的输入中,获取 hmac 由 RFC 2104 指定: https://www.ietf.org/rfc/rfc2104.txt

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

关于java - 将 C++ md5 编码转换为 android/java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35113100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com