๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ๋ฐœ ์ผ์ง€ ๐Ÿ‘ฉ‍๐Ÿ’ป

AES-256 ์•”ํ˜ธํ™” ๊ฐ€์ด๋“œ - Spring boot

by chuyj15 2025. 11. 11.
728x90
๋ฐ˜์‘ํ˜•
SMALL

AES-256 ์•”ํ˜ธํ™” ๊ฐ€์ด๋“œ

๋ชฉ์ฐจ

  1. AES ์•”ํ˜ธํ™”๋ž€?
  2. ์™œ IV๋ฅผ ๋žœ๋คํ•˜๊ฒŒ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋‚˜?
  3. ๋žœ๋ค IV๋กœ ๋ณตํ˜ธํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•
  4. ์™œ SecretKey๋ฅผ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•˜๋‚˜?
  5. ์‹ค์ œ ๋™์ž‘ ์˜ˆ์‹œ

AES ์•”ํ˜ธํ™”๋ž€?

AES (Advanced Encryption Standard) ๋Š” ๋ฏธ๊ตญ ์ •๋ถ€ ํ‘œ์ค€ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.

์•”ํ˜ธํ™”์— ํ•„์š”ํ•œ 3๊ฐ€์ง€ ์š”์†Œ

ํ‰๋ฌธ(Plain Text) + SecretKey + IV  →  ์•”ํ˜ธ๋ฌธ(Cipher Text)

1. SecretKey (๋น„๋ฐ€ํ‚ค)

  • ์—ญํ• : ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™”์˜ ํ•ต์‹ฌ ์—ด์‡ 
  • ๊ธธ์ด: AES-256์€ 32๋ฐ”์ดํŠธ(256๋น„ํŠธ) ํ•„์š”
  • ํŠน์ง•: ์ ˆ๋Œ€ ๋…ธ์ถœ๋˜๋ฉด ์•ˆ ๋˜๋Š” ๊ฐ’
  • ๋น„์œ : ์ง‘์˜ ๋งˆ์Šคํ„ฐ ํ‚ค

2. IV (Initialization Vector)

  • ์—ญํ• : ์•”ํ˜ธํ™”์˜ ์‹œ์ž‘์ ์„ ๋ฌด์ž‘์œ„๋กœ ๋งŒ๋“œ๋Š” ๊ฐ’
  • ๊ธธ์ด: 16๋ฐ”์ดํŠธ(128๋น„ํŠธ)
  • ํŠน์ง•: ์•”ํ˜ธ๋ฌธ๋งˆ๋‹ค ๋‹ฌ๋ผ์•ผ ํ•˜๋ฉฐ, ๋…ธ์ถœ๋˜์–ด๋„ ์ƒ๊ด€์—†์Œ
  • ๋น„์œ : ์•”ํ˜ธ๋ฌธ์„ ์„ž๋Š” ์†Œ๊ธˆ(Salt)

3. ์•”ํ˜ธํ™” ๋ชจ๋“œ

  • CBC (Cipher Block Chaining): ๋ธ”๋ก ๋‹จ์œ„๋กœ ์ฒด์ธ์ฒ˜๋Ÿผ ์—ฐ๊ฒฐํ•˜์—ฌ ์•”ํ˜ธํ™”
  • ์ด์ „ ๋ธ”๋ก์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค์Œ ๋ธ”๋ก ์•”ํ˜ธํ™”์— ์˜ํ–ฅ์„ ์คŒ

์™œ IV๋ฅผ ๋žœ๋คํ•˜๊ฒŒ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋‚˜?

โŒ ๊ณ ์ • IV์˜ ๋ฌธ์ œ์ 

์‹œ๋‚˜๋ฆฌ์˜ค: ๋ฐฉ๋ฌธ์ž ์ด๋ฆ„ ์•”ํ˜ธํ™”

// ๊ธฐ์กด ์ฝ”๋“œ (๊ณ ์ • IV ์‚ฌ์šฉ)
byte[] ivBytes = {0x00, 0x00, 0x00, ...}; // ํ•ญ์ƒ ๊ฐ™์Œ

String name1 = "ํ™๊ธธ๋™";
String encrypted1 = encrypt(name1); // ๊ฒฐ๊ณผ: "Abc123=="

String name2 = "ํ™๊ธธ๋™";  
String encrypted2 = encrypt(name2); // ๊ฒฐ๊ณผ: "Abc123=="  ← ๋˜‘๊ฐ™์Œ! ๐Ÿšจ

๋ฌธ์ œ์ :

  1. ๊ฐ™์€ ํ‰๋ฌธ์€ ํ•ญ์ƒ ๊ฐ™์€ ์•”ํ˜ธ๋ฌธ์ด ์ƒ์„ฑ๋จ
  2. ๊ณต๊ฒฉ์ž๊ฐ€ ํŒจํ„ด์„ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Œ
  3. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํƒˆ์ทจ๋‹นํ•˜๋ฉด ๊ฐ™์€ ์ด๋ฆ„๋“ค์„ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ

์˜ˆ์‹œ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์œ ์ถœ ์‹œ

SELECT visitor_name, COUNT(*) 
FROM tb_visitor 
GROUP BY visitor_name;

-- ๊ฒฐ๊ณผ
visitor_name          | count
----------------------+-------
Abc123==              | 150   ← 150๋ช…์ด ๊ฐ™์€ ์ด๋ฆ„
Xyz789==              | 80    ← 80๋ช…์ด ๊ฐ™์€ ์ด๋ฆ„
Def456==              | 1     ← 1๋ช…๋งŒ ์žˆ๋Š” ํฌ๊ท€ํ•œ ์ด๋ฆ„

๊ณต๊ฒฉ์ž๋Š” ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค:

  • "Abc123==๋Š” 150๋ช…์ด๋‚˜ ๋˜๋‹ˆ๊นŒ '๊น€์ฒ ์ˆ˜' ๊ฐ™์€ ํ”ํ•œ ์ด๋ฆ„์ผ ๊ฑฐ์•ผ"
  • "Def456==๋Š” 1๋ช…๋งŒ ์žˆ์œผ๋‹ˆ ํฌ๊ท€ํ•œ ์ด๋ฆ„์ด๊ฒ ๋„ค"

์ด๊ฒƒ์ด ๋ฐ”๋กœ ํŒจํ„ด ๋ถ„์„ ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค.

โœ… ๋žœ๋ค IV ์‚ฌ์šฉ ์‹œ

// ๊ฐœ์„ ๋œ ์ฝ”๋“œ (๋žœ๋ค IV)
byte[] iv = generateRandomIV(); // ๋งค๋ฒˆ ๋‹ค๋ฆ„

String name1 = "ํ™๊ธธ๋™";
String encrypted1 = encrypt(name1); // ๊ฒฐ๊ณผ: "Xyz789TnmK8w..."

String name2 = "ํ™๊ธธ๋™";
String encrypted2 = encrypt(name2); // ๊ฒฐ๊ณผ: "Pqr456MlkJ2x..."  ← ๋‹ค๋ฆ„! โœ…

์žฅ์ :

  1. ๊ฐ™์€ ํ‰๋ฌธ๋„ ๋งค๋ฒˆ ๋‹ค๋ฅธ ์•”ํ˜ธ๋ฌธ
  2. ํŒจํ„ด ๋ถ„์„ ๋ถˆ๊ฐ€๋Šฅ
  3. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์œ ์ถœ ์‹œ์—๋„ ์•ˆ์ „

๋žœ๋ค IV๋กœ ๋ณตํ˜ธํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•

ํ•ต์‹ฌ ์›๋ฆฌ: IV๋ฅผ ์•”ํ˜ธ๋ฌธ์— ํฌํ•จ์‹œํ‚จ๋‹ค

IV๋Š” ๋น„๋ฐ€ ์ •๋ณด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•”ํ˜ธ๋ฌธ๊ณผ ํ•จ๊ป˜ ์ €์žฅํ•ด๋„ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

์•”ํ˜ธํ™” ๊ณผ์ •

1๋‹จ๊ณ„: ๋žœ๋ค IV ์ƒ์„ฑ
   IV = [A1, B2, C3, D4, ...] (16๋ฐ”์ดํŠธ)

2๋‹จ๊ณ„: ํ‰๋ฌธ ์•”ํ˜ธํ™”
   ํ‰๋ฌธ = "ํ™๊ธธ๋™"
   SecretKey + IV๋กœ ์•”ํ˜ธํ™”
   ์•”ํ˜ธ๋ฌธ = [E5, F6, G7, H8, ...] (๊ฐ€๋ณ€ ๊ธธ์ด)

3๋‹จ๊ณ„: IV + ์•”ํ˜ธ๋ฌธ ๊ฒฐํ•ฉ
   ์ตœ์ข… ๊ฒฐ๊ณผ = [A1, B2, C3, D4, E5, F6, G7, H8, ...]
                ↑---------------↑  ↑-----------------↑
                    IV (16)           ์•”ํ˜ธ๋ฌธ (๊ฐ€๋ณ€)

4๋‹จ๊ณ„: Base64 ์ธ์ฝ”๋”ฉ
   ์ €์žฅํ•  ๊ฐ’ = "Abc123XyzDef456..."

๋ณตํ˜ธํ™” ๊ณผ์ •

1๋‹จ๊ณ„: Base64 ๋””์ฝ”๋”ฉ
   ์ž…๋ ฅ๊ฐ’ = "Abc123XyzDef456..."
   ๋””์ฝ”๋”ฉ = [A1, B2, C3, D4, E5, F6, G7, H8, ...]

2๋‹จ๊ณ„: IV ์ถ”์ถœ
   ์ฒ˜์Œ 16๋ฐ”์ดํŠธ = IV = [A1, B2, C3, D4, ...]

3๋‹จ๊ณ„: ์•”ํ˜ธ๋ฌธ ์ถ”์ถœ
   ๋‚˜๋จธ์ง€ = ์•”ํ˜ธ๋ฌธ = [E5, F6, G7, H8, ...]

4๋‹จ๊ณ„: ๋ณตํ˜ธํ™”
   SecretKey + ์ถ”์ถœํ•œ IV๋กœ ์•”ํ˜ธ๋ฌธ ๋ณตํ˜ธํ™”
   ๊ฒฐ๊ณผ = "ํ™๊ธธ๋™"

์‹ค์ œ ์ฝ”๋“œ

// ์•”ํ˜ธํ™”
public String encrypt(String plainText) {
    byte[] iv = generateRandomIV();              // 1. ๋žœ๋ค IV ์ƒ์„ฑ
    byte[] encrypted = doEncrypt(plainText, iv); // 2. ์•”ํ˜ธํ™”

    // 3. IV + ์•”ํ˜ธ๋ฌธ ๊ฒฐํ•ฉ
    byte[] combined = ByteBuffer.allocate(16 + encrypted.length)
            .put(iv)           // ์•ž์— IV
            .put(encrypted)    // ๋’ค์— ์•”ํ˜ธ๋ฌธ
            .array();

    return Base64.encode(combined); // 4. Base64 ์ธ์ฝ”๋”ฉ
}

// ๋ณตํ˜ธํ™”
public String decrypt(String encryptedText) {
    byte[] combined = Base64.decode(encryptedText); // 1. Base64 ๋””์ฝ”๋”ฉ

    // 2. IV ์ถ”์ถœ (์•ž 16๋ฐ”์ดํŠธ)
    byte[] iv = Arrays.copyOfRange(combined, 0, 16);

    // 3. ์•”ํ˜ธ๋ฌธ ์ถ”์ถœ (๋‚˜๋จธ์ง€)
    byte[] encrypted = Arrays.copyOfRange(combined, 16, combined.length);

    return doDecrypt(encrypted, iv); // 4. ๋ณตํ˜ธํ™”
}

์‹œ๊ฐ์  ์˜ˆ์‹œ

์•”ํ˜ธํ™” ๊ฒฐ๊ณผ (Base64 ๋ฌธ์ž์—ด):
"YxZ3nP8kLm2Qr5T9WvXy1234567890AbCdEfGh..."
 ↑-------------------------↑ ↑-----------------↑
    ์•ž 22์ž ์ •๋„: IV           ๋‚˜๋จธ์ง€: ์‹ค์ œ ์•”ํ˜ธ๋ฌธ
    (16๋ฐ”์ดํŠธ Base64)

๋ณตํ˜ธํ™” ์‹œ:
1. Base64 ๋””์ฝ”๋”ฉ
2. ์•ž 16๋ฐ”์ดํŠธ ์ถ”์ถœ → IV
3. ๋‚˜๋จธ์ง€ ์ถ”์ถœ → ์•”ํ˜ธ๋ฌธ
4. IV์™€ SecretKey๋กœ ์•”ํ˜ธ๋ฌธ ๋ณตํ˜ธํ™”

์™œ SecretKey๋ฅผ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•˜๋‚˜?

โŒ ํ•˜๋“œ์ฝ”๋”ฉ์˜ ๋ฌธ์ œ์ 

public class AES256 {
    // ์†Œ์Šค์ฝ”๋“œ์— ํ‚ค๊ฐ€ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ!
    public static String secretKey = "qwerqwerqwer";
}

๋ฌธ์ œ ์ƒํ™ฉ:

1. GitHub ๊ณต๊ฐœ ์ €์žฅ์†Œ์— ํ‘ธ์‹œ

git push origin main
# → ์ „ ์„ธ๊ณ„ ๋ˆ„๊ตฌ๋‚˜ secretKey๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Œ! ๐Ÿšจ

2. ๋‚ด๋ถ€ ์ง์›์ด ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Œ

  • ๊ฐœ๋ฐœ์ž A, B, C ๋ชจ๋‘ ๋งˆ์Šคํ„ฐ ํ‚ค๋ฅผ ์•Œ๊ฒŒ ๋จ
  • ํ‡ด์‚ฌํ•œ ์ง์›๋„ ํ‚ค๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์Œ

3. ํ‚ค ๋ณ€๊ฒฝ์ด ์–ด๋ ค์›€

  • ํ‚ค๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์ฝ”๋“œ ์ˆ˜์ • → ๋นŒ๋“œ → ๋ฐฐํฌ ํ•„์š”
  • ๊ธด๊ธ‰ ์ƒํ™ฉ์— ๋Œ€์‘ ๋ถˆ๊ฐ€

4. ํ™˜๊ฒฝ๋ณ„๋กœ ๋‹ค๋ฅธ ํ‚ค ์‚ฌ์šฉ ๋ถˆ๊ฐ€

  • ๊ฐœ๋ฐœ/ํ…Œ์ŠคํŠธ/์šด์˜ ํ™˜๊ฒฝ ๋ชจ๋‘ ๊ฐ™์€ ํ‚ค ์‚ฌ์šฉ
  • ๊ฐœ๋ฐœ DB๊ฐ€ ์œ ์ถœ๋˜๋ฉด ์šด์˜ DB๋„ ์œ„ํ—˜

โœ… ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์‚ฌ์šฉ

application.properties

# ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
encryption.secret-key=${ENCRYPTION_SECRET_KEY}

์„œ๋ฒ„ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •

# ๊ฐœ๋ฐœ ์„œ๋ฒ„
export ENCRYPTION_SECRET_KEY="dev-key-12345678901234567890123"

# ์šด์˜ ์„œ๋ฒ„  
export ENCRYPTION_SECRET_KEY="prod-key-98765432109876543210987"

์žฅ์ :

  1. ์†Œ์Šค์ฝ”๋“œ์— ํ‚ค๊ฐ€ ์—†์Œ
    • GitHub์— ์˜ฌ๋ผ๊ฐ€๋„ ์•ˆ์ „ (.gitignore์— application.properties์„ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ ๋งํ•˜๋Š”๊ฑฐ์ž„)
    • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋ด๋„ ์‹ค์ œ ํ‚ค๋Š” ๋ชจ๋ฆ„
  2. ํ™˜๊ฒฝ๋ณ„๋กœ ๋‹ค๋ฅธ ํ‚ค ์‚ฌ์šฉ
    • ๊ฐœ๋ฐœ: dev-key-...
    • ์šด์˜: prod-key-...
    • ๊ฐœ๋ฐœ DB ์œ ์ถœ ์‹œ ์šด์˜์€ ์•ˆ์ „
  3. ํ‚ค ๊ต์ฒด ์šฉ์ด
    • ํ™˜๊ฒฝ๋ณ€์ˆ˜๋งŒ ๋ณ€๊ฒฝ ํ›„ ์žฌ์‹œ์ž‘
    • ์ฝ”๋“œ ์ˆ˜์ •/๋นŒ๋“œ ๋ถˆํ•„์š”
  4. ์ ‘๊ทผ ํ†ต์ œ
    • ์„œ๋ฒ„ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ๋žŒ๋งŒ ํ‚ค ํ™•์ธ ๊ฐ€๋Šฅ
    • ์ผ๋ฐ˜ ๊ฐœ๋ฐœ์ž๋Š” ํ‚ค๋ฅผ ๋ชจ๋ฆ„

์‹ค์ œ ์šด์˜ ์‹œ๋‚˜๋ฆฌ์˜ค

[๊ฐœ๋ฐœ ํ™˜๊ฒฝ]
์†Œ์Šค์ฝ”๋“œ: GitHub์— ๊ณต๊ฐœ
ํ™˜๊ฒฝ๋ณ€์ˆ˜: ๋กœ์ปฌ PC์—๋งŒ ์„ค์ •
  → ENCRYPTION_SECRET_KEY=๊ฐœ๋ฐœ์šฉํ‚ค

[ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ]
์†Œ์Šค์ฝ”๋“œ: ๋™์ผ
ํ™˜๊ฒฝ๋ณ€์ˆ˜: ํ…Œ์ŠคํŠธ ์„œ๋ฒ„์—๋งŒ ์„ค์ •
  → ENCRYPTION_SECRET_KEY=ํ…Œ์ŠคํŠธ์šฉํ‚ค

[์šด์˜ ํ™˜๊ฒฝ]
์†Œ์Šค์ฝ”๋“œ: ๋™์ผ
ํ™˜๊ฒฝ๋ณ€์ˆ˜: ์šด์˜ ์„œ๋ฒ„์—๋งŒ ์„ค์ • (๋ณด์•ˆํŒ€๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ)
  → ENCRYPTION_SECRET_KEY=์šด์˜์šฉํ‚ค

์‹ค์ œ ๋™์ž‘ ์˜ˆ์‹œ

์‹œ๋‚˜๋ฆฌ์˜ค: ๋ฐฉ๋ฌธ์ž ์ •๋ณด ์ €์žฅ ๋ฐ ์กฐํšŒ

1. 4. ๊ฒ€์ƒ‰์€ ์–ด๋–ป๊ฒŒ?

๋ฌธ์ œ: ์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ๋Š” ๊ฒ€์ƒ‰์ด ์•ˆ ๋ฉ๋‹ˆ๋‹ค!

-- ์ด๋ ‡๊ฒŒ ๊ฒ€์ƒ‰ ๋ถˆ๊ฐ€
SELECT * FROM tb_visitor 
WHERE visitor_name = 'ํ™๊ธธ๋™';  -- ์•”ํ˜ธํ™”๋˜์–ด ์žˆ์–ด์„œ ๋ชป ์ฐพ์Œ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

 

๋ฐฉ๋ฒ• 2: ํ•ด์‹œ ์ปฌ๋Ÿผ ์ถ”๊ฐ€
CREATE TABLE tb_visitor (
    visitor_id int4 PRIMARY KEY,
    visitor_name varchar(200),      -- ์•”ํ˜ธํ™”๋œ ์ด๋ฆ„
    visitor_name_hash varchar(64),  -- ๊ฒ€์ƒ‰์šฉ ํ•ด์‹œ
    visitor_phone varchar(200)      -- ์•”ํ˜ธํ™”๋œ ์ „ํ™”๋ฒˆํ˜ธ
);
String name = "ํ™๊ธธ๋™";
String encrypted = aes256Util.encrypt(name);
String hash = SHA256.hash(name); // ํ•ด์‹œ๋Š” ๊ฐ™์€ ์ž…๋ ฅ → ๊ฐ™์€ ์ถœ๋ ฅ

visitor.setVisitorName(encrypted);
visitor.setVisitorNameHash(hash);

๊ฒ€์ƒ‰ ์‹œ:

SELECT * FROM tb_visitor 
WHERE visitor_name_hash = SHA256('ํ™๊ธธ๋™');

์š”์•ฝ

IV (Initialization Vector)

์งˆ๋ฌธ ๋‹ต๋ณ€
์™œ ๋žœ๋ค์œผ๋กœ? ๊ฐ™์€ ํ‰๋ฌธ๋„ ๋‹ค๋ฅธ ์•”ํ˜ธ๋ฌธ ์ƒ์„ฑ → ํŒจํ„ด ๋ถ„์„ ๋ฐฉ์ง€
๋ณตํ˜ธํ™”๋Š”? ์•”ํ˜ธ๋ฌธ ์•ž์— IV๋ฅผ ํฌํ•จ์‹œ์ผœ ์ €์žฅ → ๋ณตํ˜ธํ™” ์‹œ ์ถ”์ถœํ•˜์—ฌ ์‚ฌ์šฉ
๋…ธ์ถœ๋˜๋ฉด? ์ƒ๊ด€์—†์Œ (๋น„๋ฐ€ ์ •๋ณด๊ฐ€ ์•„๋‹˜)
ํฌ๊ธฐ 16๋ฐ”์ดํŠธ (128๋น„ํŠธ) ๊ณ ์ •

SecretKey

์งˆ๋ฌธ ๋‹ต๋ณ€
์™œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ? ์†Œ์Šค์ฝ”๋“œ ๋…ธ์ถœ ๋ฐฉ์ง€, ํ™˜๊ฒฝ๋ณ„ ๋‹ค๋ฅธ ํ‚ค ์‚ฌ์šฉ
ํ•˜๋“œ์ฝ”๋”ฉํ•˜๋ฉด? GitHub ์œ ์ถœ, ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ๊ฒŒ ๋จ, ํ‚ค ๋ณ€๊ฒฝ ์–ด๋ ค์›€
๋…ธ์ถœ๋˜๋ฉด? ๋ชจ๋“  ์•”ํ˜ธํ™” ๋ฐ์ดํ„ฐ ๋ณตํ˜ธํ™” ๊ฐ€๋Šฅ (์น˜๋ช…์ )
ํฌ๊ธฐ 32๋ฐ”์ดํŠธ (256๋น„ํŠธ) ๊ณ ์ •

์•”ํ˜ธํ™” ํ๋ฆ„

[์•”ํ˜ธํ™”]
ํ‰๋ฌธ → (SecretKey + ๋žœ๋คIV) → ์•”ํ˜ธ๋ฌธ → IV+์•”ํ˜ธ๋ฌธ ๊ฒฐํ•ฉ → Base64 → DB ์ €์žฅ

[๋ณตํ˜ธํ™”]  
DB ์กฐํšŒ → Base64 ๋””์ฝ”๋”ฉ → IV ์ถ”์ถœ → ์•”ํ˜ธ๋ฌธ ์ถ”์ถœ → (SecretKey + IV) → ํ‰๋ฌธ

๋ณด์•ˆ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • โœ… IV๋Š” ๋งค๋ฒˆ ๋žœ๋คํ•˜๊ฒŒ ์ƒ์„ฑ
  • โœ… SecretKey๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌ
  • โœ… SecretKey๋Š” 32๋ฐ”์ดํŠธ (AES-256)
  • โœ… ์šด์˜/๊ฐœ๋ฐœ ํ™˜๊ฒฝ๋ณ„๋กœ ๋‹ค๋ฅธ ํ‚ค ์‚ฌ์šฉ
  • โœ… GitHub์— ํ‚ค๊ฐ€ ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š๋„๋ก .gitignore ์„ค์ •
  • โœ… ์•”ํ˜ธํ™” ๋Œ€์ƒ: ์ด๋ฆ„, ์ „ํ™”๋ฒˆํ˜ธ, ์ด๋ฉ”์ผ ๋“ฑ ๊ฐœ์ธ์ •๋ณด
  • โš ๏ธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์•”ํ˜ธํ™”๊ฐ€ ์•„๋‹Œ ํ•ด์‹œ(BCrypt) ์‚ฌ์šฉ

์ฐธ๊ณ  ์ž๋ฃŒ

728x90
๋ฐ˜์‘ํ˜•
LIST