이전에는 Hmac을 사용해서 암호화를 구현해 보았는데,
암호화된 링크를 복호화하여 정보를 가져와야 했기 때문에
복호화가 불가능(단방향 암호화)한 Hmac은 적절하지 않다는 판단이 들었다.
이전 구현 게시글 보러 가기
Hmac를 사용하여 url 암호화 구현해 보기
링크를 공유할 때 단순히 링크를 공유하게 되면 보안에 문제*가 있다고 하여, Hmac을 사용해 url 암호화를 구현해 보았다. * 링크를 단순히 공유할 경우의 보안 문제1. 링크 탈취 가능성-> 예를 들
dazz6study.tistory.com
그래서 복호화가 가능한 AES를 사용해 보기로 했다.
// 복호화 후에 user 식별자가 필요하므로 식별자:시간 형식으로 만듦
String data = userId + ":" + System.currentTimeMillis();
// 비밀 키 생성
// 이전과 동일하게 application.properties에 보관
// Hmac과 다른 점 : AES 키 길이는 16, 24, 32바이트만 가능
SecretKeySpec secretKey = new SecretKeySpec(SECRET_KEY.getBytes(), "AES");
// Cipher 클래스 (암호화/복호화 제공) 사용
// 사용할 알고리즘 및 패딩 지정
// PKCS5Padding : SECRET_KEY가 16바이트로 나누어 떨어지지 않을 경우 부족한 부분을 채워 줌
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
// 암호화 및 복호화 전에 Cipher 객체를 암호화 모드(Cipher.ENCRYPT_MODE) 로 초기화
// 암호화 작업에 사용할 대칭 키(암호화와 복호화에 동일 키 사용)를 함께 제공
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// 암호화 수행
byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
// 암호화된 데이터를 URL-safe Base64 형식으로 인코딩하여 return
return Base64.getUrlEncoder().withoutPadding().encodeToString(encrypted);
// 암호화 때 사용했던 비밀키
SecretKeySpec secretKey = new SecretKeySpec(SECRET_KEY.getBytes(StandardCharsets.UTF_8), "AES");
// 암호화 때 사용했던 방법과 동일하게 지정
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
// 암호화 후 인코딩된 데이터를 디코딩한 후 복호화
byte[] decryptedBytes = cipher.doFinal(Base64.getUrlDecoder().decode(encryptedUrl));
// 복호화 결과 문자열로 변환
String decryptedData = new String(decryptedBytes, StandardCharsets.UTF_8);
// ":"로 구분된 데이터 분리 (userId와 timestamp)
// 콜론(:)은 암호화시 지정한 문자열
String[] parts = decryptedData.split(":");
// 첫 번째 부분(userId)을 사용자 ID로 변환하여 return
return Integer.parseInt(parts[0]);
정보처리기사 공부 이후에 암호화나 알고리즘 같은 지식이 휘발되고 있었는데
덕분에 다시 공부할 수 있었는데...
아무래도 자격증 시험을 위한 공부는 너무 얕아서 실질적으로 적용하는 것까지 많이 공부해야 할 것 같다.
'BACK > Spring' 카테고리의 다른 글
| JPA - QueryDSL (0) | 2024.12.05 |
|---|---|
| SpringBoot 환경에서 ChatGpt API 사용해 보기 - Spring AI (0) | 2024.12.04 |
| Hmac를 사용하여 url 암호화 구현해 보기 (0) | 2024.11.25 |
| SpringBoot 환경에서 ChatGpt API 사용해 보기 (0) | 2024.11.22 |
| Spring 12 (0) | 2024.08.09 |