자바로 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가 호환성이 좋다.
- 구버전 확장자 암호화 때문에 삽질을 많이 했는데 관련내용은 .. 나중에 엑셀 암호화 할때 올리겠다..😅
'공부 > JAVA | JSP&Servlet | Spring' 카테고리의 다른 글
[JAVA] 워드 암호화, doc 암호화, docx 암호화 (org.apache.poi) (0) | 2024.11.17 |
---|---|
[JAVA] 엑셀 암호화, xls 암호화, xlsx 암호화 (org.apache.poi) (2) | 2024.09.18 |
[JAVA 에러] nested excption is java.lang.NoSuchMethodError: xxx.xxx.xxx.xxxx.access$0 에러 해결 (ft. 클래스$0, $1 파일들..) (0) | 2024.05.19 |
[JAVA] JDK 설치 및 환경변수 설정하는 방법 완벽정리! (0) | 2019.09.03 |
vs code import 하는 법 / vs code import 단축키 (0) | 2019.07.19 |