Android NDK获取二进制文件的md5

Android NDK get md5 of the binary file

描述

我正在尝试获取存储在 /data/data/my.package.name/file.dex 中的二进制 (.dex) 文件的 md5 哈希值。我使用 Android NDK (C++).

问题

获取文件哈希值的几种方法:

  1. 从我的笔记本电脑:md5sum file.dex -> 5a65273b2ee336ad2c45a9306be162f6
  2. 使用 adb shell:md5sum file.dex -> 5a65273b2ee336ad2c45a9306be162f6
  3. 来自我的 C++ 代码:
    int err = 0;
    zip *z = zip_open(getBaseApkAbsolutePath(), 0, &err);

    const char *name = "classes.dex";
    struct zip_stat st;
    zip_stat_init(&st);
    zip_stat(z, name, 0, &st);

    char *contents = new char[st.size];

    zip_file *f = zip_fopen(z, name, 0);
    zip_fread(f, contents, st.size);

    std::ofstream ofstream;
    ofstream.open("/data/data/my.package/classes.dex", std::ofstream::binary);
    ofstream.write(contents, st.size);

    joyee::MD5 md5 = joyee::MD5();
    md5.update(contents, sizeof(contents));
    md5.finalize();

    LOG(md5.toString());
    LOG(joyee::md5(contents));

    zip_fclose(f);
    zip_close(z);

然后我得到这个 -> aaaeb407992f9fe57cc6235ece90ec35

澄清

  1. 我的代码可以很好地处理像 Hello, World!
  2. 这样的简单字符串
  3. MD5 实现效果很好

问题

如何使用 C++ 获取 Android 中二进制文件的 md5 哈希值?

这是问题所在:

md5.update(contents, sizeof(contents));

您使用的是 指针 的大小(即 4 或 8),而不是它指向的缓冲区。您实际上是在计算前几个字节的 md5sum。改为传递 st.size 以检查完整文件。