2011년 9월 부터 개인정보 보호법이 시행하면서 기업에서 개인정보를 수집할때 개인정보를 안전하게 보관 해야하는 의무가 생겼다.
개인정보를가 유출되어도 피해를 최소화,개인정보보호 규제 준수를 해야한다.

단방향 암호화는 단방향으로 암호화 암호화 해서 복호화가 불가능한 암호화를 말한다. 비밀번호 저장이나 무결성 검증에 사용되며,대표적인 알고리즘으로는 bcrypt, SHA-256, SHA-512 등이 있다.
양방향 암호화는 단방향 암호화랑 달리 복호화가 가능한 암호화다 복호화 키 종류로는 대치킹와 비대칭 키가 있다.
대칭키 암호화 (Symmetric Key Encryption)
비 대칭키 암호화(Asymmetric Key Encryption)
차후 사용할 알고리즘 과 그 알고리즘 동작 방식은 코드 설명후 자세히 설명하겠습니다!
@Value("${security.aes.secret-key}")
private String aesSecretKey;
private SecretKeySpec secretKeySpec;
@PostConstruct
public void init() {
byte[] keyBytes = aesSecretKey.getBytes(StandardCharsets.UTF_8);
secretKeySpec = new SecretKeySpec(keyBytes, "AES");
}
properties에 있는 키 값을 겨져 올때 @Value를 사용해서 가져온다.
SecretKeySpec 객체는 암호화를 할 때 알고리즘이 어떤 알고리즘을 사용하여 암호화할것인지 거기에 맞게 구성해주는 걸로 명시 해준다.
private String generateIV(){
byte[] iv = new byte[16];
new SecureRandom().nextBytes(iv);
String resultIV =Base64.getEncoder().encodeToString(iv);
log.info("iv값 확인 {}",resultIV);
return resultIV;
}
IV를 생성하는 메서드이다. IV는 16바이트로 고정되며, SecureRandom()을 사용해 예측이 어려운 무작위 값으로 채운다.
생성된 IV는 Base64로 인코딩된 문자열로 변환되어 반환된다.
public String encoding(String planText){
try {
String iv = generateIV();
IvParameterSpec ivSpec = new IvParameterSpec(Base64.getDecoder().decode(iv));
Cipher cipher =Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE,secretKeySpec,ivSpec);
byte[] encrypted = cipher.doFinal(planText.getBytes(StandardCharsets.UTF_8));
String encryptedBase64 = Base64.getEncoder().encodeToString(encrypted);
return iv+encryptedBase64;
}catch (Exception e) {}
throw new CustomException(ErrorCode.ENCODING_ERROR);
}
파리미터는 평문이 들어오고 ,IvparameterSpec 는 Cipher 암호화 메서드에서 초기화 벡터 설정용으로 사용한다
Cipher는 "AES"방식으로,"CBC"암호화 블록,padding 구성한다.
cipher가 어떤 방식으로 할것인지 지정해준다 암호화여서 파라미터에는, 암호화 모드,시크릿키값,IV값 을 넣고 ,encrypted에 암호된 정보를 byte로 저장하고 다시 String 값으로 변환해준다.
iv값이 실행할때마다 바뀌니까 IV+encryptedBase64로 저장한다.
public String decoding(String encodingText){
try{
String ivBase64 = encodingText.substring(0,24);
String cipherBase64 = encodingText.substring(24);
IvParameterSpec ivSpec = new IvParameterSpec(Base64.getDecoder().decode(ivBase64));
byte[] encrypted = Base64.getDecoder().decode(cipherBase64);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE,secretKeySpec,ivSpec);
byte[] decrypted = cipher.doFinal(encrypted);
return new String(decrypted, StandardCharsets.UTF_8);
}catch (Exception e) {}
throw new CustomException(ErrorCode.DECODING_ERROR);
}
파라미터의 String 값으로 암호화된 값을 받고 encoding했을때 IV+시크릿만으로 암호화된값을 했을때 IV값을 분리해서 암호화된거와 동일하게 AES방식 CBC 암호화블럭 사용 padding방식으로 해주고
cipher 복호화 모드,시크릿키,iv 사용해주고 byte를 문자열로 변환
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
암호화 조치서 안내서중에 password는 해싱함수로 암호화를해야한다고 써져있다.
해싱함수중에 Bcrypt이다. SpringSecurity에서 제공해서 편하게 썻다.. ㅎㅎ

성공! 후후...
log로 간단하게 찍긴했는데 controller에 있는데 service단위에 이동해서 각계층에 역활을 분리 할예정입니다.
일단 암호화 파트하면서 생각을 많이 했던거 같다. 용어도 어렵고 자주 쓰는객체가 아닌 부분도 있어 조금 힘들었다..

긴글 읽어 주셔서 감사합니다 :)