암호화 알고리즘 종류 / Java 암호화 유틸 개발 / AES256, Base64 등 암복호화 방법

단방향 암호화

복호화 불가하여 비밀번호 암호화에 적합합니다.

SHA-256

사용자가 입력한 비밀번호를 암호화 후 SHA-256 해시 앞 16자리를 잘라서 유저 테이블 비밀번호 컬럼에 저장된 SHA-256 해시 앞 16자리와 비교하여 로그인하기도 합니다.

SHA-512

SHA-256보다 자릿수가 훨씬 길고, 보안이 강화된 암호화 알고리즘입니다.

MD5

128비트 고정 길이의 출력값을 가집니다.


양방향 암호화

복호화 가능합니다.

비밀키 암호화 기법

대칭형 암호화이고 비밀키로 암/복호화합니다.

  • 블록 암호화 방식 : DES, AES 등
  • 스트림 암호화 방식 : LFSR, RC4 등

공개키 암호화 기법

비대칭형 암호화이고 공개키로 암호화, 개인키로 복호화합니다.

  • RSA 등

SHA512 암호화 방법

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.security.MessageDigest;

@Slf4j
@Component
public class SHA512Util {

    public String getSHA512(String raw) throws Exception {
        MessageDigest md = MessageDigest.getInstance("SHA-512");
        md.update(raw.getBytes());

        byte[] msgb = md.digest();

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < msgb.length; i++) {
            String tmp = Integer.toHexString(msgb[i] & 0xFF);
            while (tmp.length() < 2)
                tmp = "0" + tmp;
            sb.append(tmp.substring(tmp.length() - 2));
        }
        return sb.toString();
    }
}

위 SHA512 유틸 생성 후 암호화 가능합니다.


AES256 암복호화 방법

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.Key;

public class AES256Util {
    private byte[] iv;
    private byte[] sessionKey;
    private Key keySpec;

    public AES256Util(String key) {
        try {
            this.iv = new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

            sessionKey = key.substring(0, 32).getBytes(StandardCharsets.UTF_8);
            SecretKeySpec secretKeySpec = new SecretKeySpec(sessionKey, "AES");

            this.keySpec = secretKeySpec;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    // 암호화
    public String aesEncode(String str) {
        try {
            Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
            c.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv));

            byte[] encrypted = c.doFinal(str.getBytes("UTF-8"));
            String enStr = new String(Base64.encodeBase64(encrypted));

            return enStr;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    //복호화
    public String aesDecode(String str) {
        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

            IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
            SecretKeySpec secretKeySpec = new SecretKeySpec(sessionKey, "AES");

            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
            byte[] cipheredText = cipher.doFinal(Base64.decodeBase64(str));
            return (new String(cipheredText, "UTF-8"));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

AES256Util 암호화 예시

AES256Util aes256Util = new AES256Util("32자리키값");
String encStr = aes256Util.aesEncode("암호화할값");

base64 암복호화 방법

import java.util.Base64;

public class Base64Util {

  public String base64Encode(String str) throws UnsupportedEncodingException {
    String result = "";
    byte[] targetBytes = str.getBytes("UTF-8");
    Base64.Encoder encoder = Base64.getEncoder();
    String encodedString = encoder.encodeToString(targetBytes);
    result = encodedString;
    return result;
  }

  public String base64Decode(String str) throws UnsupportedEncodingException {
    String result = "";
    Base64.Decoder decoder = Base64.getDecoder();
    byte[] decodedBytes2 = decoder.decode(str);
    result = new String(decodedBytes2, "UTF-8");
    return result;
  }

}

base64 암호화 예시

Base64Util base64Util = new Base64Util();
String encStr = base64Util.base64Encode("암호화할값");

Leave a comment