공부/JAVA | JSP&Servlet | Spring

[JAVA] PPT 암호화 , PPTX 암호화 (org.apache.poi)

bumcrush 2024. 9. 7. 11:01
반응형

자바로 MS 오피스 파일들 암호화할 일이 생겼서 짠 코드가 있는데,

심심하니 블로그에 하나씩 올려볼까 한다.

 

일단 PPT, PPTX 암호화 하는 코드 먼저 올리고.. 시간되는대로 엑셀, 워드, PDF 도 올려야겠다.

 

✅ 암호화 하는 대표 라이브러리로는 org.apache.poi 가 있다.

다른 라이브러리 써보겠다고 삽질을 여러번 했는데,

PDF 빼고는 결국 아파치 poi 로 다 해결했다 😁

 

  pom.xml

- 관련 라이브러리들..

- 이거 라이브러리 어떤 버전에는 해당 메소드가 없거나 변경된 경우가 있어 라이브러리 버전 충돌이 많다. 

- 이것 때문에 고생을 좀해서, 라이브러리 버전 꼭 확인할 것 !   

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>TEST2</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>


    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.1.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.xmlbeans</groupId>
            <artifactId>xmlbeans</artifactId>
            <version>3.1.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-compress</artifactId>
            <version>1.23.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>4.1.2</version>
        </dependency>

        <!-- .pdf 파일 암호화 -->
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.22</version>
        </dependency>

    </dependencies>

</project>

 

 

 

✅  ppt 암호화, pptx 암호화 소스코드

package org.example;

import org.apache.poi.hslf.usermodel.*;
import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
import org.apache.poi.poifs.crypt.EncryptionInfo;
import org.apache.poi.poifs.crypt.EncryptionMode;
import org.apache.poi.poifs.crypt.Encryptor;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.sl.usermodel.PictureData;
import org.apache.poi.sl.usermodel.Shape;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFPictureShape;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFTextBox;

import java.io.*;
import java.util.Map;

public class PptEnct {
    public static void main(String[] args) {
        String path = System.getProperty("user.dir");
        System.out.println("현재 작업 경로: " + path);

        String inputFilePath = "C:/test/example.pptx";  // 암호화할 PPTX 파일 경로
        String outputFilePath = "C:/test/example_enct.pptx";  // 암호화된 파일 저장 경로
        String password = "1234";  // 암호

        try {
            if (inputFilePath.endsWith(".pptx")) {


                // 원본 PPTX 파일 읽기
                FileInputStream fis = new FileInputStream(inputFilePath);

                // 암호화 설정
                POIFSFileSystem fs = new POIFSFileSystem();
                EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile);
                Encryptor encryptor = info.getEncryptor();
                encryptor.confirmPassword(password);


                XMLSlideShow ppt = new XMLSlideShow(fis);
                fis.close();


                // 암호화된 파일을 작성할 OutputStream 생성
                OutputStream os = encryptor.getDataStream(fs);
                ppt.write(os);
                os.close(); //스트림을 닫습니다.

                /**
                 OPCPackage opc = OPCPackage.open(new File(inputFilePath), PackageAccess.READ_WRITE);
                 OutputStream os = encryptor.getDataStream(fs);
                 opc.save(os);
                 opc.close();
                 **/

                try (FileOutputStream fos = new FileOutputStream(outputFilePath)) {
                    fs.writeFilesystem(fos);
                }

                fs.close();     //닫기
                ppt.close();

                System.out.println("pptx 파일이 성공적으로 암호화되었습니다.");
            }else if (inputFilePath.endsWith(".ppt")) {

                //try-with-resources 구문
                try(POIFSFileSystem fs = new POIFSFileSystem(new File(inputFilePath), true);
                    FileOutputStream os = new FileOutputStream(outputFilePath))
                {
                    Biff8EncryptionKey.setCurrentUserPassword(password);
                    HSLFSlideShow hss = new HSLFSlideShow(fs);

                    hss.write(os);
                    hss.close();

                    System.out.println("ppt 암호화가 완료되었습니다. " + outputFilePath);
                }catch (IOException e) {
                    e.printStackTrace();
                }

            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

 

- inputFilePath 변수 : 암호화 할 ppt 파일이 있는 경로 

- outputFilePath 변수 : 암호화 작업 후 파일을 저장할 경로 

- password : ppt 파일에 걸 암호화 

 

- 소스코드는 간단하다.

1. inputFilePath 변수를 읽어와 파일의 확장자를 따져서 

2. ppt와 pptx 따라 로직을 나누었고.. (실제 두개 암호화 처리할 때 사용하는 메소드가 다르다.)

3. password 변수에 입력된 값으로 암호화한다.

4. 암호화된 파일을 outputFilePath 변수에 입력된 경로에 저장한다. 

 

 

- 위의 프로그램은 일반 java로 짯는데,  웹개발로 할 경우 사용자로 부터 비밀번호를 입력받아와서 password 변수에 넣어주면 된다. 👍

 

 


✅  ppt 암호화 프로그램 실행

1. 우선 inputFilePath  변수에 입력한 경로 그대로 샘플 pptx 파일을 생성

 

 

 

 

2. ppt 암호화 프로그램 실행 > 암호화 성공 메시지 확인

 

 

3. outputFilePath 변수에 암호화 파일 생성되었는지 확인 

 

 

4. example_enct.pptx 파일 실행 시 암호화 잘 걸렸는지 확인하고,

password 변수에 넣은 비밀번호 입력해서 잘 풀리는지도 확인 완료 ! 😁👍

 

 

 

 

 

✅  [참고내용] PPT, PPTX 차이점 

- PPT 확장자는 2003년 이전에 사용하던 옛날버전 확장자,

바이너리 파일 포맷으로 저장, 파일크기가 상대적으로 크다.

 

- PPTX 확장자는 2007년 이후로 사용하는 버전 ,

XML 기반의 파일형식으로 저장, 구조화되고 압축되어 저장되어 파이크기가 PPT에 비해 상대적으로 작다. 

 

- 당연히 최신 버전인 PPTX가 호환성이 좋다.

 

- 구버전 확장자 암호화 때문에 삽질을 많이 했는데 관련내용은 .. 나중에 엑셀 암호화 할때 올리겠다..😅

 

반응형