【问题标题】:In order to validate an image file I have checked the magic number of the file .Is it possible to change the magic number of the files?为了验证图像文件,我检查了文件的幻数。是否可以更改文件的幻数?
【发布时间】:2014-02-28 06:10:25
【问题描述】:

我的要求是检查文件是否为 jpeg / jpg / png 。我写了以下代码。

public boolean isFileValid(File file) throws IOException {
        DataInputStream input = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
        int fileSignature = input.readInt();
            input.close();
        logger.info(fileSignature);
        if (fileSignature == 0xffd8ffe0) {
            logger.info("File is jpeg");
            return true;
        } else if(fileSignature == 0x89504E47){
            logger.info("file is in PNG");
            return true;
        } else {return false;}

    }

我使用的是 ubuntu 13.04,上面的代码对我来说很好。我读到文件签名在各种操作系统中没有变化(我不太确定这一点,因为我没有在其他操作系统中测试过)。也是可以改变文件的签名吗?有没有更好的方法可以在不使用第三方库的情况下做到这一点?

【问题讨论】:

  • if (fileSignature == 0xffd8ffe0) {} else if(fileSignature == 0xffd8ffe0){}??

标签: java validation file-format magic-numbers


【解决方案1】:

首先,您输入了错误的 JPG 幻数。它的长度不是 4 个字节,只有两个,它是 0xffd8(你的幻数的前半部分)。如果我明白你在问什么,那么幻数是由它们的文件类型规范定义的,它们应该在任何平台上和任何时候都是相同的。说白了,如果你有不同的幻数,那不是你要找的文件。当相同的文件类型有多个幻数时,有一些罕见的例外情况,但这通常是为了与旧的/不同的标准兼容。

此外,如果文件具有正确的幻数并不一定意味着它是正确类型的文件。从技术上讲,您的方法将仅使用幻数作为正确的 png/jpg 图像的数据“标记”文件。

因此,检查幻数是检查文件是否有效 png/jpg 过程中的第一步(您可以将其视为某种“文件类型哈希值”),但如果幻数检查通过,则应继续分析文件结构并根据其规范检查文件是否包含有意义的文件数据。

您可以在 wikipedia 中轻松找到规范(以及官方规范的实际链接): http://en.wikipedia.org/wiki/Portable_Network_Graphics#Technical_details http://en.wikipedia.org/wiki/JPEG#Syntax_and_structure

【讨论】:

    猜你喜欢
    • 2011-08-21
    • 2011-02-10
    • 2012-08-22
    • 2018-04-10
    • 1970-01-01
    • 2012-02-01
    • 2014-07-03
    • 2011-08-09
    • 2018-06-27
    相关资源
    最近更新 更多