Development/Java

JDK8에서 SHA512 암호화/해시화 구현하기

bbubbush 2022. 4. 22. 13:11

들어가며

외부 API 통신 중 검증 데이터를 해시화하여 비교하는 유효성 로직이 있었다. 대부분 SHA방식은 단방향 암호화 방식이기에 민감정보를 DB에 저장할 때 사용하거나, API 간 데이터 검증에서 사용된다.

 

본인은 후자의 방법으로 사용하였다.

예를 들면 A사의 이름, 연락처, 이메일 정보를  B사에 전달하여 해당 데이터에 맞는 고객정보가 있는지 조회하는 API가 있다고 하자.

 

별도의 VPN을 통해 데이터를 주고받을 수도 있지만 비용과 시간의 제약 안에서 현실적인 해결 방법은 데이터의 암호화 및 유효한 통신 주체인지 확인할 수 있는 검증 데이터를 사용하는 선택을 한다.

 

그래서 API 필드 중  "이름+연락처+이메일” 정보를 묶어 SHA로 해시화하고 비밀키로 AES 방식으로 한번 더 암호화하였다. 이를 checkData 필드로 전달하여 API를 검증하는 데 사용한다. 그러면 받는 쪽에서는 checkData 필드를 복호화 한 해시값과 전달받은 필드를 활용하여  두 값을 비교해 볼 수 있다.

 

아래는 위와 같은 상황을 코드로 작성한 결과다.

String inCheckData = decodeAes(param.getCheckData());  // AES로 암호화된 검증데이터 복호화

// 이름 + 연락처 + 이메일   정보를 한번에 SHA-512로 암호화 하면 위 데이터와 동일한 결과값을 기대할 수 있다.
String makeCheckData = sha512(param.getName() + param.getHp() + param.getEmail());

if (!inCheckData.equals(makeCheckData)) {
  throw InvalidDataException("데이터 검증에 실패하였습니다.");
}

 

이해를 돕기 위해 간단한 필드를 기준으로 작성하였지만 checkData에 포함되는 항목에 서버에서 발송한 시간 등 가변적인 데이터를 포함한다면 데이터 검증 능력은 더욱 좋아질 수 있다.(물론 API 항목에 서버 발송시간 필드가 추가되어야 가능하다)

 

SHA 암호화란?

암호화 방식은 아래와 같이 분류된다.

먼저 복호화가 가능한지에 따라 양방향 / 단방향으로 구분되고,

복호화할 때 사용하는 비밀키가 암호화할 때 그대로 사용되면 대칭키, 서로 다른 키를 사용하면 비대칭키가 된다.

 

SHA 알고리즘은 복호화가 불가능하기 때문에 단방향 암호화 알고리즘에 해당한다.

 

 

반응형

 

코드로 만들어보기

JDK8을 이용해서 개발했고 별도의 라이브러리는 없이 내장된 클래스만 사용하였다. 이렇게 자바 버전을 강조하는 이유는 JDK 11 버전부터는 DatatypeConverter.class를 더 이상 지원하지 않는다. 따라서 Base64나 Hex값으로 인코딩해야 할 경우 별도의 처리가 필요하다.

 

아래는 SHA-512 방식으로 구현한 코드이다.

public static String encodeSha(String planeText) {
  String encodingText = "";
  try {
    // SHA-512, SHA-256, SHA1 등 다양한 방식으로 활용
    MessageDigest md = MessageDigest.getInstance("SHA-512");
    md.update(planeText.getBytes(StandardCharsets.UTF_8));
    encodingText = DatatypeConverter.printBase64Binary(md.digest());
  } catch (NoSuchAlgorithmException e) {
    // throws가 싫어서 RuntimeException을 사용
    throw new RuntimeException(e);
  }
  return encodingText;
}

 

특별한 문제가 없다면 보안 강도를 높이기 위해 SHA-512 사용을 권한다. 참고로 JAVA 9 부터는 "SHA3-512" 등의 암호화 표현방식도 사용 가능하다.

 

마치며

오늘은 단방향 암호화 방식인 SHA-512 방식을 알아보았다. 최대한 별도의 라이브러리 없이 순수한 Java로만 구현하는데 초점을 두었기 때문에 처음 접하시는 분들도 가볍게 따라 할 수 있다고 생각한다.

 

Spring 환경에서 사용한 소스코드를 참고하고 싶다면 아래 github 주소에서 볼 수 있다.

https://github.com/bbubbush/bb-encryption-api

 

GitHub - bbubbush/bb-encryption-api

Contribute to bbubbush/bb-encryption-api development by creating an account on GitHub.

github.com

 

추가내용

간단하게 테스트 해볼 수 있는 웹사이트를 만들었다.

https://bbubbush.com/sha

 

bb-crypto-vue

 

bbubbush.com