공부/JAVA | JSP&Servlet | Spring

[JAVA] 워드 암호화, doc 암호화, docx 암호화 (org.apache.poi)

bumcrush 2024. 11. 17. 12:11
반응형


미루고 미뤄왔던 자바로 MS 워드(word) 암호화하는 코드 포스팅을 해보겠다.

 

전반적인 로직과 내용은 이전 포스팅과 비슷하니

간략하게 코드만 남길 예정 !

(자세한 내용은 이전 PPT, 엑셀 암호화 포스팅 참고하면 될 듯 )

2024.09.07 - [공부/JAVA | JSP&Servlet | Spring] - [JAVA] PPT 암호화 , PPTX 암호화 (org.apache.poi)

2024.09.18 - [공부/JAVA | JSP&Servlet | Spring] - [JAVA] 엑셀 암호화, xls 암호화, xlsx 암호화 (org.apache.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>

 

 

✅ 워드 암호화 (doc 암호화, docx 암호화) 코드

package org.example;

import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
import org.apache.poi.hwpf.HWPFDocument;
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.xwpf.usermodel.XWPFDocument;

import java.io.*;

public class DocEnct {
    public static void main(String[] args) throws Exception {
        String inputFilePath = "C:/test/워드파일sample.docx";  // 암호화할 PPTX 파일 경로
        String outputFilePath = "C:/test/워드파일sample_enc.docx";  // 암호화된 파일 저장 경로
        String password = "1234";  // 암호

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

                // .docx 파일 열기
                FileInputStream fis = new FileInputStream(inputFilePath);
                XWPFDocument document = new XWPFDocument(fis);
                fis.close();

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

                // 암호화된 파일을 작성할 OutputStream 생성
                OutputStream os = enc.getDataStream(fs);
                document.write(os);
                os.close();

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

                document.close();
            }else if(inputFilePath.endsWith(".doc")){
                //try-with-resources 구문
                try(POIFSFileSystem fs = new POIFSFileSystem(new File(inputFilePath), true);
                    FileOutputStream os = new FileOutputStream(outputFilePath))
                {
                    Biff8EncryptionKey.setCurrentUserPassword(password);
                    HWPFDocument doc = new HWPFDocument(fs);

                    doc.write(os);
                    doc.close();

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

- inputFilePath 변수 : 암호화 할 워드 파일 경로 (*파일 이름 적을 때, 확장자 까지 붙여줄것)

- outputFilePath 변수 : 워드 암호화 작업 후 파일을 저장할 경로  (*파일 이름 적을 때, 확장자 까지 붙여줄것)

- password 변수 : 워드 파일에 걸 암호 

 

 

 

반응형