Android NDK 获取二进制文件的 md5

Android NDK get md5 of the binary file

本文关键字:md5 二进制文件 获取 NDK Android      更新时间:2023-10-16

说明

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

问题

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

  1. 从我的笔记本电脑:md5sum file.dex -> 5a65273b2ee336ad2c45a9306be162f6
  2. 使用 adb shellmd5sum 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. MD5 实现效果很好

问题

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

这是问题所在:

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

您采用指针的大小(4 或 8),而不是它指向的缓冲区。因此,您有效地计算了前几个字节的md5sum。改为传递st.size以检查完整文件。