지난번 ppt 암호화에 이어서 엑셀 암호화 포스팅을 올린다.
✅ 라이브러리는 org.apache.poi 라이브러리를 사용한다.
처음에 구버전 확장자인 xls 암호화가 잘 안되어서
Aspose.Cells 라이브러리를 사용하려했는데,
어찌저찌 잘해결되어서 아파치 poi로 다 해결하였다.
(참고로 아파치 poi는 무료, Aspose 라이브러리는 유료이다.. 😅)
✅ pom.xml
- 저번 포스팅이랑 똑같다.
- 아파치 poi 라이브러리 버전마다 메소드 변경되고 삭제된 것들이 있어서 충돌이 날 수 있으니, 꼭 버전 확인해줄 것!
<?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>
✅ 엑셀 암호화 (xls 암호화, xlsx 암호화) 코드
package org.example;
import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.xssf.usermodel.XSSFWorkbook;
import java.io.*;
public class ExcelEnct {
public static void main(String[] args) {
//String inputFilePath = "C:/test/다시테스트.xls"; // 암호화할 엑셀 파일 경로
//String outputFilePath = "C:/test/다시테스트_encrypted.xls"; // 암호화된 파일 저장 경로
String inputFilePath = "C:/test/다시테스트.xlsx"; // 암호화할 엑셀 파일 경로
String outputFilePath = "C:/test/다시테스트_encrypted2.xlsx"; // 암호화된 파일 저장 경로
String password = "1234"; // 원하는 암호
try{
if (inputFilePath.endsWith(".xlsx")) {
FileInputStream fis = new FileInputStream(inputFilePath);
XSSFWorkbook workbook = new XSSFWorkbook(fis);
fis.close();
System.out.println("inputFile 암호화 여부:" + workbook.isStructureLocked());
// 암호화 정보 설정
POIFSFileSystem fs = new POIFSFileSystem();
EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile);
Encryptor encryptor = info.getEncryptor();
encryptor.confirmPassword(password);
// 암호화된 엑셀 파일 저장
OutputStream os = encryptor.getDataStream(fs);
workbook.write(os);
os.close();
try (FileOutputStream fos = new FileOutputStream(outputFilePath)) {
fs.writeFilesystem(fos);
}
workbook.close();
System.out.println("엑셀 파일이 암호화되었습니다." + outputFilePath);
} else if (inputFilePath.endsWith(".xls")) {
//try-with-resources 구문
try(POIFSFileSystem fs = new POIFSFileSystem(new File(inputFilePath), true);
FileOutputStream os = new FileOutputStream(outputFilePath))
{
Biff8EncryptionKey.setCurrentUserPassword(password);
HSSFWorkbook hwb = new HSSFWorkbook(fs.getRoot(), true);
hwb.write(os);
hwb.close();
System.out.println("xls 엑셀 파일이 암호화되었습니다." + outputFilePath);
}catch (IOException e) {
e.printStackTrace();
}
} else {
throw new IOException("지원하지 않는 파일 형식입니다: " + inputFilePath);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
- inputFilePath 변수 : 암호화 할 엑셀 파일 경로 (*파일 이름 적을 때, 확장자 까지 붙여줄것)
- outputFilePath 변수 : 엑셀 암호화 작업 후 파일을 저장할 경로 (*파일 이름 적을 때 , 확장자명 까지 붙여줄것)
- password 변수 : 엑셀 파일에 걸 암호
✅ 소스코드 간략 설명
1. inputFilePath 변수의 파일을 읽어와 확장자를 체크한다.
2. xls, xlsx 확장자인지에 따라 사용 라이브러리 메소드가 다르므로 if문으로 처리 로직을 나눈다.
3. password 변수에 입력한 값으로 암호화 한다.
4. 암호화된 엑셀 파일을 outputFilePath 변수에 입력된 경로에 저장한다.
✅ 엑셀 암호화 프로그램 실행
1. inputFilePath 변수에 입력한 변수 그대로 샘플 xlsx 파일 생성
2. 엑셀 암호화 프로그램 실행
3. outputFilePath 경로에 엑셀 암호화 파일이 생성되었는지 확인
4. 파일을 열어, password 변수에 입력한 비밀번호로 잘 암호화 됐는지 확인 👍
✅ [참고내용] xls , xlsx 차이점
- xls : 2003년 이전에 사용된 엑셀의 확장자,
바이너리 파일 형식, 구조 복잡하고 파일크기가 상대적으로 크다.
- xlsx : 2007년 이후부터 사용된 엑셀 확장자,
오픈 XML 형식, 구조화되고 압축되어 저장되어 파일크기가 xls에 비해 상대적으로 작다.
호환성도 신버전인 xlsx가 더 좋음
쉽게 말해
xls = 구버전, xlsx = 신버전 으로 이해 하면 쉽다.
✅ [참고내용] xls 확장자, xlsx 암호화 라이브러리 클래스
파일 형식이 xls은 바이너리, xlsx은 xml으로 각기 다르기 때문에,
암호화 할때 필요로하는 lib class도 다르다.
구버전인 xls 확장자는 Biff8EncryptionKey 클래스를 사용하고
신버전인 xlsx 확장자는 Encryptor 클래스를 사용한다.
첨부터 공식문서를 천천히 잘 읽었으면,
헤매지 않았을텐데, 제대로 안읽으니깐 구버전 암호화 하는데.. 삽질을 많이 했다 ㅋㅋㅋ 😂
(오늘도 공식문서를 잘 읽자는 교훈을 되새긴다 _)
decryption 관련해서도 샘플코드까지 친절히 나와있으니,
필요하신분들은 참고해 보시길..😁
👇 👇 apache POI 공식 문서
https://poi.apache.org/encryption
이제 남은건 워드 암호화랑 pdf 암호화구나..
남은것들은 내용이 중복되니 짧게 코드만 기록해놔야겠다.
'공부 > JAVA | JSP&Servlet | Spring' 카테고리의 다른 글
[JAVA] PDF 암호화 (org.apache.pdfbox) (1) | 2024.11.20 |
---|---|
[JAVA] 워드 암호화, doc 암호화, docx 암호화 (org.apache.poi) (0) | 2024.11.17 |
[JAVA] PPT 암호화 , PPTX 암호화 (org.apache.poi) (1) | 2024.09.07 |
[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 |