오늘 이전 작업 올리고 6시간이 흘렀다...
그동안 암호화와 복호화만 열심히 했다...
원래는 스프링 세큐리티를 사용한 암호화/복호화를 해보려고 했었다.
https://goddaehee.tistory.com/321
https://ye-geeee.tistory.com/74
https://derveljunit.tistory.com/339
특히 이대로 만들었다면 마지막 링크처럼 만들어졌을 듯하다.
그러다가 이 포스팅을 보았다.
캬~! 국내 전문가가 만든 128비트 블록 암호 알고리즘이라니
이쪽으로 만들어 보기로 했다.
(앞에 스프링 세큐리티로 2시간이 날아갔다)
https://seed.kisa.or.kr/kisa/Board/17/detailView.do
메뉴얼曰 pbszUserKey랑 pbszIV는 반드시 16 Bytes.
그런데 시험해보니 16 Bytes를 넘겨도 잘 작동됐다.
아무튼 소스코드를 집어넣었다.
어찌어찌 해석한 암호화와 복호화
SEED_CBC_Encrypt 메서드
- 사용자키(pbszUserKey), 초기화 벡터(pbszIV), 암호화할 메세지(message), 메세지 오프셋과 길이를 입력한다.
- 메시지를 패딩하여 블록 크기의 배수로 만들고, SEED_CBC 초기화 및 처리를 통해 암호화한다.
SEED_CBC_Decrypt 메서드
- 사용자키(pbszUserKey), 초기화 벡터(pbszIV), 복화할 메세지(message), 메세지 오프셋과 길이를 입력한다.
- 복호화를 수행하기 전에 패딩을 확인하고, 패딩이 올바르지 않으면 null을 반환한다.
- SEED_CBC 초기화 및 처리를 통해 복호화를 수행하고, 결과로 원문을 반환한다.
그렇게 만들어진 컨트롤러
package com.moonBam.controller.member;
import java.nio.charset.StandardCharsets;
import org.springframework.stereotype.Controller;
import com.moonBam.config.KISA_SEED_CBC;
@Controller
public class TestTest {
private static final byte[] pbszUserKey = "jthe!minthe@kee#".getBytes(); //반드시 16바이트(메뉴얼 44pg)
private static final byte[] pbszIV = "hetalpsuemekete!".getBytes(); //반드시 16바이트(메뉴얼 44pg)
public static byte[] encrypt(String rawMessage) {
byte[] message = rawMessage.getBytes(StandardCharsets.UTF_8);
byte[] encryptedMessage = KISA_SEED_CBC.SEED_CBC_Encrypt(pbszUserKey, pbszIV, message, 0, message.length);
return encryptedMessage;
}
public static String decrypt(byte[] encryptedMessage) {
byte[] decryptedMessage = KISA_SEED_CBC.SEED_CBC_Decrypt(pbszUserKey, pbszIV, encryptedMessage, 0, encryptedMessage.length);
return new String(decryptedMessage);
}
}
현재 회원가입 시스템은 메일 전송을 통한 인증이 된다는 전제 하에 이루어지고 있다.
메일 시스템은 암호화보다는 쉬울 것 같으니 내일하고 암호화/복호화 시스템을 마저 구현해야겠다.
아마도 이런 시스템으로 구축할 듯 싶다.
1. 회원가입 시 암호화된 비밀번호 저장
2. 로그인 시 비밀번호를 입력하면 다르게 암호화된 비밀번호로 전송
3. 양쪽 암호를 동시에 복호화하여 일치를 확인
++++
포스트 마치려는 순간, 암호화된 데이터가 Bytes로 출력된다는 것을 깨달았다.
그러면 기존 코드가 많이 꼬이지 않을까???
간단하게 암호화된 결과를 new String으로 변환시켜서 넘겨보았다...라고 하기 전에
기존 함수의 return 값이 변형되자 에러를 사정없이 쏟았다.
그래서 함수를 하나 더 끼워넣는 꼼수를 써보니 넘어가긴 하더라
깨지는 모습으로 보아 변환 방식이 잘못되지 않았을까? 하는 생각이 들어 Base64로 바꾸기로 했다.
잘 바뀌는 걸 확인할 수 있었다.
내일 메일 시스템 넣고 적용해보면서 고칠 부분이 생길 수도 있겠지만 일단 만족
package com.moonBam.controller.member;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import org.springframework.stereotype.Controller;
import com.moonBam.config.KISA_SEED_CBC;
@Controller
public class SecurityController {
private static final byte[] pbszUserKey = "jthe!minthe@kee#".getBytes(); //반드시 16바이트(메뉴얼 44pg)
private static final byte[] pbszIV = "hetalpsuemekete!".getBytes(); //반드시 16바이트(메뉴얼 44pg)
//암호화 시작(String 타입으로 출력)
public String encrypt(String mesg) {
byte[] byteMesg = doEncrypt(mesg);
String resultString = Base64.getEncoder().encodeToString(byteMesg);
return resultString;
}
//암호화 시스템
public static byte[] doEncrypt(String StringMessage) {
byte[] message = StringMessage.getBytes(StandardCharsets.UTF_8);
byte[] byteEncryptedMessage = KISA_SEED_CBC.SEED_CBC_Encrypt(pbszUserKey, pbszIV, message, 0, message.length);
String encryptedMessage = new String(byteEncryptedMessage);
return byteEncryptedMessage;
}
//복호화 시작(String 타입으로 암호를 받음)
public String decrypt(String mesg) {
byte[] resultByteArray = Base64.getDecoder().decode(mesg);
String decryptedMessage = doDecrypt(resultByteArray);
return decryptedMessage;
}
//복호화 시스템
public static String doDecrypt(byte[] encryptedMessage) {
byte[] decryptedMessage = KISA_SEED_CBC.SEED_CBC_Decrypt(pbszUserKey, pbszIV, encryptedMessage, 0, encryptedMessage.length);
return new String(decryptedMessage);
}
}
'팀프로젝트 > SpringBoot' 카테고리의 다른 글
스프링 부트 팀플)_20240311 (0) | 2024.03.11 |
---|---|
스프링 부트 팀플) 20240310_암호화/복호화 적용 (0) | 2024.03.10 |
스프링 부트 팀플) 20240310_이메일 인증 구현 (0) | 2024.03.10 |
스프링 부트 팀플) 20240310_이메일 시스템 구축 (0) | 2024.03.10 |
스프링 부트 팀플) 20240309_전환 시작 (0) | 2024.03.09 |