Java 为了验证图像文件,我检查了文件的幻数。是否可以更改文件的幻数?

Java 为了验证图像文件,我检查了文件的幻数。是否可以更改文件的幻数?,java,validation,file-format,magic-numbers,Java,Validation,File Format,Magic Numbers,我的要求是检查文件是否为jpeg/jpg/png。我已经编写了以下代码 public boolean isFileValid(File file) throws IOException { DataInputStream input = new DataInputStream(new BufferedInputStream(new FileInputStream(file))); int fileSignature = input.readInt();

我的要求是检查文件是否为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;}

    }

我正在使用Ubuntu13.04,上面的代码对我来说很好。我读到文件签名在不同的O.S.之间没有变化(我不是很确定,因为我没有在其他O.S.中测试过它)。还有可能改变文件的签名吗?在不使用第三方库的情况下,有没有更好的方法

首先,您有错误的JPG幻数。它的长度不是4个字节,只有两个字节,它是
0xffd8
(魔法数字的前半部分)。如果我理解你的要求,那么幻数是由它们的文件类型规范定义的,它们在任何平台上都应该是相同的。坦率地说,如果你有不同的魔法数字,它不是你正在寻找的文件。当同一文件类型有几个幻数时,会出现一些罕见的例外情况,但这通常是为了与旧的/不同的标准兼容

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

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

您可以在维基百科中轻松找到规范(以及官方规范的实际链接):
如果(文件签名==0xffd8ffe0){}如果(文件签名==0xffd8ffe0){}
??