-
AES ์๋ณตํธํ๋ฅผ ์ํ key์์ฑ ์ฝ๋๋ก ๋ง๋ค๊ธฐ
Contents
AES ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ์ฌ.
- ์๋ณตํธํ๊ฐ ๊ฐ๋ฅํ ๋ํ์ ์ธ ์๋ฐฉํฅ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
- ์๋ฃ์์ผ๋ก ์ฐพ์๋ณด๋ฉด AES(Advanced Encryption Standard)๋ ๋์นญ ํค ์ํธํ ๋ฐฉ์์ ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ๋ฏธ๊ตญ ๊ตญ๋ฆฝํ์ค๊ธฐ์ ์ฐ๊ตฌ์(NIST)์ ์ํด 2001๋ ํ์ค์ผ๋ก ์ฑํ๋์์ต๋๋ค. Rijndael ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ๋์์ผ๋ฉฐ, ๋์ ๋ณด์์ฑ๊ณผ ๋น ๋ฅธ ์ฑ๋ฅ ๋๋ถ์ ๋ค์ํ ๋ณด์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋๋ฆฌ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค.
AES ํน์ง
- ๋์นญ ํค ์ํธํ: ๋์ผํ ํค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ํธํ ๋ฐ ๋ณตํธํํฉ๋๋ค.
- ๊ณ ์ ๋ ๋ธ๋ก ํฌ๊ธฐ: AES๋ 128๋นํธ ๋ธ๋ก ํฌ๊ธฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋ค์ํ ํค ๊ธธ์ด ์ง์: 128๋นํธ, 192๋นํธ, 256๋นํธ ํค ๊ธธ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋ณด์์ฑ: ๊ธฐ์กด์ DES(Data Encryption Standard)๋ณด๋ค ๊ฐ๋ ฅํ ๋ณด์์ฑ์ ์๋ํฉ๋๋ค.
- ๋น ๋ฅธ ์๋: ์ํํธ์จ์ด ๋ฐ ํ๋์จ์ด์์ ํจ์จ์ ์ผ๋ก ๋์ํฉ๋๋ค.
AES ์ํธํ ๊ณผ์
-
AES ์ํธํ๋ ์ฌ๋ฌ ๋ผ์ด๋(Round)์ ์ฐ์ฐ์ ํตํด ์ด๋ฃจ์ด์ง๋๋ค. ์ฌ์ฉ๋๋ ํค ๊ธธ์ด์ ๋ฐ๋ผ ๋ผ์ด๋ ์๊ฐ ๋ฌ๋ผ์ง๋๋ค.
CreatedThu, 20 Mar 2025 16:18:45 +0900 -
Java์์ AES๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด key, iv ๋ฑ ์์ฑํ๋ ์ฝ๋
- ์๊ณ ๋ฆฌ์ฆ์ AES-128, AES-192, AES-256 ์ด๋ค ๊ฑธ ์ฌ์ฉํ๋๋์ ๋ฐ๋ผ key, iv์์ฒด์ size๊ฐ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค
- ๋ณธ ๊ธ์์๋ AES/CBC/PKCS5Padding 256 ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ต๋๋ค.
Java์์ ์๋ณตํธํ์ ์ฌ์ฉํ๊ธฐ ์ํ key, iv ๋ ์ด๋ป๊ฒ ๋ง๋ค๊น?
- ํ์ ์์๋ key, iv๋ฅผ ๋ฐ์ดํฐ ์ ๊ณต ์ธก๊ณผ ์๋น์ธก์์ ์์ชฝ์์ key, iv๋ฅผ ๊ณต์ ํ๋๋ฐ key, iv๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ๋ ๋ค์ํ์ต๋๋ค.
- ๋ณธ ๊ธ์์ ๋ค์ํ ์ผ์ด์ค๋ฅผ ์ฝ๋๋ก ์ฒ๋ฆฌํ ๋ด์ฉ์ ์ ์ด๋ด ๋๋ค.
- ๋์ฒด๋ก key,iv๋ base64ํน์ hex๋ฑ์ผ๋ก encodeํด์ ์ ์ฅํ๊ณ , runtime์ decodeํด์ ์ฐ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
key ๋ง๋ค๊ธฐ ๋ค์ํ ๋ฐฉ๋ฒ
- base64๋ฑ encode ์์ด ๊ทธ๋ฅ ๋ฌธ์์ด๋ก ๋ง๋ค๊ธฐ
public String generateRandomString() { String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+"; SecureRandom random = new SecureRandom(); StringBuilder sb = new StringBuilder(32); for (int i = 0; i < 32; i++) { sb.append(CHARACTERS.charAt(random.nextInt(CHARACTERS.length()))); } return sb.toString(); }- base64๋ java.util ์ ์ฐ๊ธฐ๋ ํ๊ณ apache.commons.codec.binary๋ฑ์ ์ธ ์ ์์ต๋๋ค.
public void keyGenerator() throws NoSuchAlgorithmException { // 1. Secret Key ์์ฑ (AES-256) KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(256); // AES-256 ์ฌ์ฉ SecretKey secretKey = keyGenerator.generateKey(); // 2. IV ์์ฑ (AES CBC ๋ชจ๋์์๋ 16๋ฐ์ดํธ IV ํ์) byte[] iv = new byte[16]; SecureRandom secureRandom = new SecureRandom(); secureRandom.nextBytes(iv); // 3. Base64๋ก ์ธ์ฝ๋ฉํ์ฌ ์ถ๋ ฅ System.out.println("Secret Key (Base64): " + Base64.getEncoder().encodeToString(secretKey.getEncoded())); System.out.println("IV (Base64): " + Base64.getEncoder().encodeToString(iv)); }- base64
public void generateBase64RandomKey() { int AES_KEY_SIZE = 32; //256 bit int IV_SIZE = 16; byte[] secretKeyBytes = new byte[AES_KEY_SIZE]; byte[] ivBytes = new byte[IV_SIZE]; new SecureRandom().nextBytes(secretKeyBytes); new SecureRandom().nextBytes(ivBytes); log.info("secretKeyBytes: {}", Base64.getEncoder().encodeToString(secretKeyBytes)); log.info("ivBytes: {}", Base64.getEncoder().encodeToString(ivBytes)); }- hex
public void generateHexRandomKey() { int AES_KEY_SIZE = 32; //256 bit int IV_SIZE = 16; byte[] secretKeyBytes = new byte[AES_KEY_SIZE]; byte[] ivBytes = new byte[IV_SIZE]; new SecureRandom().nextBytes(secretKeyBytes); new SecureRandom().nextBytes(ivBytes); log.info("secretKeyBytes: {}", bytesToHex(secretKeyBytes)); log.info("ivBytes: {}", bytesToHex(ivBytes)); }- 32byte(256bit) ๋๋ค ๋ฌธ์์ด ๋ง๋ค๊ณ , base64 encode ํ๊ธฐ
public void generateRandomStringAndGenerateKey() { int size = 32; String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+"; SecureRandom random = new SecureRandom(); StringBuilder sb = new StringBuilder(size); for (int i = 0; i < size; i++) { sb.append(CHARACTERS.charAt(random.nextInt(CHARACTERS.length()))); } String secretKeyBase64 = Base64.getEncoder().encodeToString(sb.toString().getBytes()); String ivBase64 = Base64.getEncoder().encodeToString(sb.substring(0,16).getBytes()); }- 32byte ๋ฌธ์์ด์ ์ฌ์ฉํด์ base64 encode ํ๊ธฐ
public void generateKeyWithString() { String input = "YOUR 32์๋ฆฌ ๋ฌธ์์ด"; String secretKeyBase64 = Base64.getEncoder().encodeToString(input.getBytes()); String ivBase64 = Base64.getEncoder().encodeToString(input.substring(0,16).getBytes()); String decoded = new String(Base64.getDecoder().decode(secretKeyBase64)); }CreatedThu, 20 Mar 2025 16:18:45 +0900 -
๋ด ์ฐ๋ถํฌ ์๋ฒ์ SSL ๋ฌด๋ฃ ์ค์นํ๊ธฐ
- SSL ๋ฐ๊ธ ์ฌ์ดํธ : https://zerossl.com/ ๋ค๋ฅธ ๋ฌด๋ฃ ์ฌ์ดํธ๋ ๋ง์ด ์์ต๋๋ค๋ง ์ฌ๊ธฐ์ ๋ค ๋์ดํ ํ์๋ ์์ ๋ฏ ํฉ๋๋ค..
- ๋ด๊ฐ ์ฐ๋ ๋๋ฉ์ธ ์๋น์ค ์ ์ฒด : whois
SSL ์ค์น ์ ์ฐจ
- ๋ฌด๋ฃ SSL์ ์ ์ฝ์ฌํญ์ ๋ณ๋๋ก ์์๋ณด๊ธฐ๋ก ํ๊ณ
- ๊ธฐ๋ณธ ๊ฐ๋ ์ ๋จผ์ ์ธ์ฆ๊ธฐ๊ด์ผ๋ก ๋ถํฐ ํด๋น ๋๋ฉ์ธ์ ์์ ์ฃผ๊ฐ ๋ง๋์ง ํ์ธ์ ๋ฐ๊ณ ์ธ์ฆ๊ธฐ๊ด์ผ๋ก๋ถํฐ SSL์ธ์ฆ์์ key๋ฅผ ๋ฐ์์ ์๋ฒ์ ์ค์นํ์์ ๊ฒ์ฆ๋ฐ์ผ๋ฉด SSL๋ฐ๊ธ์ ์๋ฃํ๋ค๊ณ ํ ์ ์์ต๋๋ค..
- ์ด๋ฅผ DV(Domain Validation) ์ด๋ผ๊ณ ํ๋๋ฐ, ์๊ท๋ชจ ์ฌ์ดํธ๋ ๊ฐ๋ฐ์๋ฒ์์ ๊ฐ๋ตํ๊ฒ ๋ฌด๋ฃ๋ก ๋ฐ๊ธ๋ฐ์ ์ฌ์ฉ์์ ์ฌ์ฉํฉ๋๋ค.
๋๋ฉ์ธ ์์ ์ฃผ์์ ํ์ธ ๋ฐ๊ธฐ
- ZeroSSL์ ํ์๊ฐ์
- SSL Certificate Setup ์์ ๊ฐ ํญ๋ชฉ ์ฑ์์ค๋๋ค.
- Domains
- Validity : 90-Day Certificate ๋ก ํด์ผ ๋ฌด๋ฃ
- Add-Ons : ์๋ฌด๊ฒ๋ ์ ํํ์ง ์์์ผ ๋ฌด๋ฃ ๊ฐ๋ฅ
- CSR & Contact : Auto-Generate CSR ํ์ฑํ
- Finalize Your Order: Free ์ ํ
CreatedSat, 01 Mar 2025 15:19:58 +0900 -
Restdoc Swagger Ui Sample
์๋ก
-
๊ฐ๋ฐ์์ ํ ์คํธ ์ฝ๋์ ์ค์์ฑ์ ๋ํด์๋ ๋ฐ๋ก ํฌ์คํ ์์ ์ ๋๋ค.
-
๋ฐฑ์๋์์ api ๊ฐ๋ฐ์ ํด๋น api์ ์ฌ์ฉ๋ฒ์ ๋ํ ๋ฌธ์ํ๋ ํ์ ์์ ํ์์ ๋๋ค.
-
๊ฐ์ฅ ๋ฌด์ํ ๋ฐฉ๋ฒ์ผ๋ก๋ confluence๊ฐ ๋์๋ wiki๊ฐ ๋์๋ , ์์ ์ด ๋์๋ api ๊ฐ๋ฐ์ด ์์๋ ๋ง๋ค ์์์ ์ผ๋ก ๋ฌธ์ํํ๋ ๋ฐฉ๋ฒ์ด ์๋๋ฐ api๊ฐ ์์ ๋ ๋๋ง๋ค ๋ฌธ์๋ฅผ ์์ ํด์ค์ผ ํ๋ ๋จ์ ์ด ์์ต๋๋ค. ๊น๋นกํ๊ณ ๋ฌธ์ ์ ๋ฐ์ดํธ๊ฐ ์๋๋ ์ผ์ด์ค๊ฐ ํ์ ์์ ์ผ๋ง๋ ์์ฃผ ๋ฐ์ํ๋ ์ง๋ฅผ ์๊ฐํ๋ฉด ์ ๋ ๋น์ถ.
CreatedSat, 01 Feb 2025 20:18:03 +0900 -
-
@Component ๋ด์ static method ์์ ์ฐ๋ member ๊ฐ์ฒด๊ฐ null ์ผ๋
@Component ๋ด์ static method์์ ์ฌ์ฉํ๋ static member
@Component @RequiredArgsConstructor public class SomeComponentClass { private final ObjectMapper objectMapper; private static void staticMethod() { objectMapper.convertValue() // objectMapper NullPointerException ๋ฐ์ } }-> ์ด๋ ๊ฒ ๋ฐ๊พธ์ธ์.
@Component @RequiredArgsConstructor public class SomeComponentClass { private static ObjectMapper objectMapper; // Autowired๋ก constructor ์์ฑ @Autowired public SomeComponentClass(ObjectMapper objectMapper) { SomeComponentClass.objectMapper = objectMapper; } private static void staticMethod() { objectMapper ~~~ } }CreatedSat, 25 Jan 2025 17:14:05 +0900 -
์๋ก
- GitHub์์ **ํ๊ทธ(Tag)**๋ฅผ ๊ธฐ๋ฐ์ผ๋ก **๋ฆด๋ฆฌ์ฆ(Release)**๋ฅผ ๋ง๋ค๋ฉด,
- ๋ฆด๋ฆฌ์ฆ ๋ ธํธ๋ฅผ ์์ฑํ๊ณ , ๋ฐ์ด๋๋ฆฌ ํ์ผ(zip, tar.gz ๋ฑ)์ ์ฒจ๋ถํ ์ ์์ด์ ๋ฐฐํฌ์ ์์ฃผ ์ ์ฉํฉ๋๋ค..
- ์๋์ GitHub ๋ฆด๋ฆฌ์ฆ ์์ฑ ๋ฐ ์ฐ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํฉ๋๋ค. ๐
๐ GitHub ๋ฆด๋ฆฌ์ฆ๋?
- ํน์ ํ๊ทธ์ ๋ํ ๋ฆด๋ฆฌ์ฆ ์ ๋ณด๋ฅผ ์๊ฐํํด์ ๋ณด์ฌ์ฃผ๋ GitHub์ ๊ธฐ๋ฅ
- ๋ฆด๋ฆฌ์ฆ ๋ ธํธ ์์ฑ ๊ฐ๋ฅ
- ์คํ ํ์ผ, ์ํฐํฉํธ(.zip, .jar ๋ฑ) ์ฒจ๋ถ ๊ฐ๋ฅ
- GitHub Actions ๊ฐ์ CI ๋๊ตฌ์ ์ฝ๊ฒ ์ฐ๋ ๊ฐ๋ฅ
๐ ๏ธ GitHub ๋ฆด๋ฆฌ์ฆ ๋ง๋๋ ๋ฐฉ๋ฒ
1. Git ํ๊ทธ ๋ง๋ค๊ธฐ (๋ก์ปฌ or GitHub์์)
# ๋ก์ปฌ์์ annotated tag ๋ง๋ค๊ธฐ git tag -a v1.0.0 -m "Release version 1.0.0" # ์๊ฒฉ ํธ์ git push origin v1.0.0๋๋ GitHub ์น UI์์ ์ ํ๊ทธ๋ฅผ ๋ง๋ค ์๋ ์์.
CreatedSat, 11 Jan 2025 16:11:03 +0900