엑셀 파일을 다운로드할 때 관리자가 암호를 설정하여 암호화된 엑셀 파일을 다운로드받고 싶다는 요청이 들어왔다.
현재 엑셀 다운로드 모듈에서는 SXSSF방식을 사용하고 그에 따라 .xlsx 형식을 파일을 생성한다.
.xlsx 은 바이너리 포맷이 아닌 xml 포맷이라서 그에 맞는 암호화 방식을 사용해줘야 하기 때문에
새로 코드를 작성해야 했다.
SXSSF는 아래 [이미지 1] 에서 보이는 XSSF와 동일선상이므로 표에서 Yes로 보이는 방식을 사용해주면 된다.
아래 [이미지 2]가 암호화 코드다. 코드가 길고 복잡할까 싶었는데 의외로 단순하다.
rc4방식은 취약점이 있고 찾아보니 대부분 agile encryption 방식을 사용하는 것 같아 적용해 보았다.
"아무 문제 없겠지" 란 마음으로 복붙했는데 현재 프로젝트에 있는 poi 에는 암호화에 필수적인 EncryptionMode(enum)과 Encryptor (클래스)가 없었다... 현재 poi 버전의 소스코드를 보니 진짜로 없었다ㅠㅠ
그래서 위험 부담이 있지만 어쩔 수 없이 버전 업그레이드를 하기로 했다.
poi 버전을 변경하고 싶은데 SXSSF 를 사용하는 경우 꽤 많은 의존성이 필요하기 때문에 poi.jar 하나만 변경하는 게 아니라 관련된 lib를 다 변경해줘야 한다.
poi-**.jar
poi-ooxml-**.jar
poi-ooxml-schemas-**.jar
poi-scratchpad-**.jar
poi-exmaples-**.jar
poi-excelant-**.jar
commons-collecrtions4-4.1jar
이렇게 총 7개의 라이브러리를 새롭게 추가해주면 된다.
SXSSF 에 필요한 암호화에 필요한 클래스 등은 3.16 버전부터 쓸 수 있는 것 같아 버전을 선택한 후 해당 버전의 라이브러리에 대해 소스코드를 통해 존재 여부를 정확히 보고 변경해줬다.
이제 암호화만 하면 끝나는 줄 알았더니 deprecated된 것들이 너무 많아서 다 변경하고 테스트해야했다...
이에 관한 내용도 길지 않고, 현재 이 글도 길지 않지만
변경사항들은 일단 노션에 작성해두고 다음 글로 정리할 예정이다.
참고
1. https://devdoc.net/apache/poi-3.13/encryption.html
2. https://jar-download.com/artifacts/org.apache.poi/poi/3.16/source-code
'Java' 카테고리의 다른 글
[java.lang.ClassNotFoundException] 오류 해결 (0) | 2022.09.09 |
---|---|
JVM 이란? (0) | 2022.04.04 |
[Java] 예외처리 (0) | 2021.05.25 |