【问题标题】:Same content, different MD5 - File and String相同的内容,不同的 MD5 - 文件和字符串
【发布时间】:2013-04-03 09:14:36
【问题描述】:
  1. 我有一个文件testfile 和一个字符串teststring

  2. 我在 shell 中写道:
    echo "a" > testfile

  3. 然后xxd testfile
    所以我可以看到我的文件内容的十六进制值
    输出:

    0000000: 610a               a.
    
  4. 查看我的代码:

    int file;
    struct stat s;
    unsigned long size;
    char* buffer;
    char md5[MD5_DIGEST_LENGTH]
    
    file = open("testfile", O_RDONLY);
    if (file < 0)
        return false;
    
    if (fstat(file, &s) < 0)
    {
        close(file);
        return false;
    }
    
    size = s.st_size;                       //GET FILE SIZE
    printf("filesize: %lu\n", size);        //PRINT FILESIZE FOR DEBUGGING
    buffer = (char*)mmap(0, size, PROT_READ, MAP_SHARED, file, 0); //MAP FILE CONTENT TO BUFFER
    MD5((unsigned char*)buffer, size, md5); //GENERATE MD5
    munmap(buffer, size);                   //UNMAP BUFFER
    close(file);
    
    for (int i = 0; i < MD5_DIGEST_LENGTH; i++)
        printf("%02x", md5[i]);
    printf("\n");
    
    
    unsigned char* teststring = "\x61\x0a"; //SAME STRING AS IN THE FILE
    
    MD5((unsigned char*)teststring, 2, md5);
    for (int i = 0; i < MD5_DIGEST_LENGTH; i++)
        printf("%02x", md5[i]);
    printf("\n");
    
  5. 打印出来:

    filesize: 2  
    60b725f10c9c85c70d97880dfe8191b3  
    e29311f6f1bf1af907f9ef9f44b8328b  
    

    两个完全不同的 md5哈希。
    我尝试将buffer 写入文件
    并将teststring 写入文件它们是相同的
    为什么?
    bufferteststring 不一样吗?

【问题讨论】:

  • 以十六进制打印缓冲区/字符串(不是 md5s),看看它们是否不同。如果它们相同,您可能需要以不同的方式使用 md5 函数(某些实现需要您完成 md5 操作)
  • 如果把这两种方法的顺序颠倒一下,结果是一样的吗? (即 MD5 接口可能会继续更新校验和?)
  • 只需执行printf("%02x", buffer[0]);printf("%02x", buffer[1]);printf("%02x", teststring[0]);printf("%02x", teststring[1]);。那么你实际上知道它们是否相同(我认为它们不是)。查看文档我认为您正确使用了 md5 功能
  • 您是否尝试在调用之前和调用之间清除md5 数组?
  • @x4rf41 投票!没错,字符串是0x64 0x0a,文件是0x61 0x0a,但为什么呢?如您所见,我输入了``teststring = "\x61\x0a"

标签: c++ c md5


【解决方案1】:

正确的哈希是您的第一个哈希,60b725f10c9c85c70d97880dfe8191b3

$ echo "a" | md5
60b725f10c9c85c70d97880dfe8191b3

您的第二个散列恰好是“\x64\x0a”的散列,或者是字符 'd' 后跟换行符:

$ echo "d" | md5
e29311f6f1bf1af907f9ef9f44b8328b

您确定您发布的代码就是您正在编译/运行的代码吗?你忘记重新编译了吗?您正在执行旧的二进制文件吗?

【讨论】:

  • "您确定您发布的代码就是您正在编译的代码吗?" ——很可能不会。 char md5[] 需要是无符号的,teststring 需要是not 无符号的,甚至可以首先编译...
猜你喜欢
  • 2014-07-15
  • 1970-01-01
  • 2017-08-21
  • 2016-08-18
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
相关资源
最近更新 更多