- 이번 포스팅에선 Springboot 를 사용하여 암/복호화 라이브러리를 사용하는 코드를 작성하겠습니다.
import java.nio.charset.StandardCharsets
import java.security.MessageDigest
import java.util.*
import javax.crypto.Cipher
import javax.crypto.Mac
import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.SecretKeySpec
// [암호화, 복호화 관련 유틸]
object CryptoUtil {
// [암호화 / 복호화]
// (AES256 암호화)
fun encryptAES256(
text: String, // 암호화하려는 평문
alg: String, // 암호화 알고리즘 (ex : "AES/CBC/PKCS5Padding")
initializationVector: String, // 초기화 벡터 16byte = 16char
encryptionKey: String // 암호화 키 32byte = 32char
): String {
if (encryptionKey.length != 32 || initializationVector.length != 16) {
try {
throw RuntimeException("encryptionKey length must be 32 and initializationVector length must be 16")
} catch (e: Exception) {
throw RuntimeException(e)
}
}
val cipher = Cipher.getInstance(alg)
val keySpec = SecretKeySpec(encryptionKey.toByteArray(), "AES")
val ivParamSpec = IvParameterSpec(initializationVector.toByteArray())
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivParamSpec)
val encrypted = cipher.doFinal(text.toByteArray(StandardCharsets.UTF_8))
return Base64.getEncoder().encodeToString(encrypted)
}
// (AES256 복호화)
fun decryptAES256(
cipherText: String, // 복호화하려는 암호문
alg: String, // 암호화 알고리즘 (ex : "AES/CBC/PKCS5Padding")
initializationVector: String, // 초기화 벡터 16byte = 16char
encryptionKey: String // 암호화 키 32byte = 32char
): String {
if (encryptionKey.length != 32 || initializationVector.length != 16) {
try {
throw RuntimeException("encryptionKey length must be 32 and initializationVector length must be 16")
} catch (e: Exception) {
throw RuntimeException(e)
}
}
val cipher = Cipher.getInstance(alg)
val keySpec = SecretKeySpec(encryptionKey.toByteArray(), "AES")
val ivParamSpec = IvParameterSpec(initializationVector.toByteArray())
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivParamSpec)
val decodedBytes = Base64.getDecoder().decode(cipherText)
val decrypted = cipher.doFinal(decodedBytes)
return String(decrypted, StandardCharsets.UTF_8)
}
///////////////////////////////////////////////////////////////////////////////////////////
// [인코딩 / 디코딩]
// (Base64 인코딩)
fun base64Encode(str: String): String {
return Base64.getEncoder().encodeToString(str.toByteArray(StandardCharsets.UTF_8))
}
// (Base64 디코딩)
fun base64Decode(str: String): String {
return String(Base64.getDecoder().decode(str))
}
///////////////////////////////////////////////////////////////////////////////////////////
// [해싱]
// (SHA256 해싱)
fun hashSHA256(str: String): String {
val messageDigest = MessageDigest.getInstance("SHA-256")
messageDigest.update(str.toByteArray(StandardCharsets.UTF_8))
return bytesToHex(messageDigest.digest())
}
// (HmacSHA256)
fun hmacSha256(data: String, secret: String): String {
val sha256Hmac = Mac.getInstance("HmacSHA256")
sha256Hmac.init(SecretKeySpec(secret.toByteArray(StandardCharsets.UTF_8), "HmacSHA256"))
return Base64.getUrlEncoder().withoutPadding()
.encodeToString(sha256Hmac.doFinal(data.toByteArray(StandardCharsets.UTF_8)))
}
// (byteArray 를 Hex String 으로 반환)
fun bytesToHex(bytes: ByteArray): String {
val builder = StringBuilder()
for (b in bytes) {
builder.append(String.format("%02x", b))
}
return builder.toString()
}
}
위 코드는 단위 테스트를 마쳤음을 알려드립니다.
'Springboot' 카테고리의 다른 글
Springboot Kotlin String 문자열을 투명 배경 서명 이미지(BufferedImage) 로 변경하기 (2) | 2024.10.08 |
---|---|
Springboot Kotlin 파일 압축 및 압축 해제 코드 (5) | 2024.10.08 |
Springboot Redis 설정 및 사용 (다중 데이터 소스, Redis Cluster 적용) (1) | 2024.10.08 |
Springboot 요청/응답 자동 로깅 필터 만들기 (3) | 2024.10.08 |
Springboot JavaMailSender 로 이메일 보내기 (PlainText 발송, 첨부파일 발송, Thymeleaf HTML 이메일 발송) (2) | 2024.10.08 |