๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™” ์œ ํ‹ธ๋ฆฌํ‹ฐ์ธ Age์˜ ์ฒซ ๋ฒˆ์งธ ์•ˆ์ • ๋ฆด๋ฆฌ์Šค

Google์—์„œ Go ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๋ณด์•ˆ์„ ๋‹ด๋‹นํ•˜๋Š” ์•”ํ˜ธํ•™์ž Filippo Valsorda๊ฐ€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™” ์œ ํ‹ธ๋ฆฌํ‹ฐ์ธ Age(Actually Good Encryption)์˜ ์ฒซ ๋ฒˆ์งธ ์•ˆ์ •์ ์ธ ๋ฆด๋ฆฌ์Šค๋ฅผ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ๋Œ€์นญ(์•”ํ˜ธ) ๋ฐ ๋น„๋Œ€์นญ(๊ณต๊ฐœ ํ‚ค) ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์•”ํ˜ธํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋Š” Go๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ BSD ๋ผ์ด์„ผ์Šค์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. Linux, FreeBSD, macOS ๋ฐ Windows์šฉ ๋นŒ๋“œ๊ฐ€ ์ค€๋น„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๊ธฐ๋Šฅ์€ ์œ ํ‹ธ๋ฆฌํ‹ฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ”„๋กœ๊ทธ๋žจ์— ํ†ตํ•ฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์™€ ๋ณ„๋„๋กœ rage ํ”„๋กœ์ ํŠธ์˜ ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์—์„œ Rust ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์œ ์‚ฌํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋Œ€์ฒด ๊ตฌํ˜„์ด ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•”ํ˜ธํ™”์—๋Š” HKDF(HMAC ๊ธฐ๋ฐ˜ ์ถ”์ถœ ๋ฐ ํ™•์žฅ ํ‚ค ํŒŒ์ƒ ๊ธฐ๋Šฅ), SHA-256, HMAC(ํ•ด์‹œ ๊ธฐ๋ฐ˜ ๋ฉ”์‹œ์ง€ ์ธ์ฆ ์ฝ”๋“œ), X25519, Scrypt ๋ฐ ChaCha20-Poly1305 AEAD์™€ ๊ฐ™์€ ๊ฒ€์ฆ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Age์˜ ํŠน์ง• ์ค‘ ๋‹ค์Œ์ด ๋ˆˆ์— ๋•๋‹ˆ๋‹ค. ํด๋ฆฝ๋ณด๋“œ๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ์†Œํ˜• 512๋น„ํŠธ ๊ณต๊ฐœ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์˜ต์…˜์ด ์˜ค๋ฒ„๋กœ๋“œ๋˜์ง€ ์•Š์€ ๊ฐ„๋‹จํ•œ ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค; ๊ตฌ์„ฑ ํŒŒ์ผ ๋ถ€์กฑ; UNIX ์Šคํƒ€์ผ๋กœ ํ˜ธ์ถœ ์ฒด์ธ์„ ๊ตฌ์ถ•ํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์œ ํ‹ธ๋ฆฌํ‹ฐ์™€ ํ•จ๊ป˜ โ€‹โ€‹์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Github.keys ํŒŒ์ผ์— ๋Œ€ํ•œ ์ง€์›์„ ํฌํ•จํ•˜์—ฌ ์ž์ฒด ์••์ถ• ํ‚ค ์ƒ์„ฑ๊ณผ ๊ธฐ์กด SSH ํ‚ค("ssh-ed25519", "ssh-rsa") ์‚ฌ์šฉ์ด ๋ชจ๋‘ ์ง€์›๋ฉ๋‹ˆ๋‹ค. $ age-keygen -o key.txt ๊ณต๊ฐœ ํ‚ค: age1ql3z7hjy58pw3hyww5ayyfg7zqgvc7w3j2elw2zmrj2kg5sfn9bqmcac8p $ tar cvz ~/data | age -r age1ql3z7hjy58pw3hyww5ayyfg7zqgvc7w3j2elw2zmrj2kg5sfn9bqmcac8p > data.tar.gz.age $ age --decrypt -i key.txt data.tar.gz.age > data.tar.gz $ age -R ~/.ssh/id_ed25519.pub example.jpg > example.jpg.age $ age -d -i ~/.ssh/id_ed25519 example.jpg.age > example.jpg

ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ์ˆ˜์‹ ์ž๋ฅผ ์œ„ํ•œ ํŒŒ์ผ ์•”ํ˜ธํ™” ๋ชจ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“œ์—์„œ๋Š” ํŒŒ์ผ์ด ์—ฌ๋Ÿฌ ๊ณต๊ฐœ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์‹œ์— ์•”ํ˜ธํ™”๋˜๊ณ  ๊ฐ ์ˆ˜์‹ ์ž ๋ชฉ๋ก์ด ์ด๋ฅผ ํ•ด๋…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์นญ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ธฐ๋ฐ˜ ํŒŒ์ผ ์•”ํ˜ธํ™” ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•”ํ˜ธํ™”ํ•˜์—ฌ ๊ฐœ์ธ ํ‚ค ํŒŒ์ผ์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๋„ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์€ ์•”ํ˜ธํ™” ์ค‘์— ๋นˆ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ์ž๋™์œผ๋กœ ๊ฐ•๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. $ age -p secrets.txt > secrets.txt.age ์•”ํ˜ธ ์ž…๋ ฅ(๋ณด์•ˆ ์•”ํ˜ธ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋น„์›Œ ๋‘์„ธ์š”): ์ž๋™ ์ƒ์„ฑ๋œ ์•”ํ˜ธ "release-response-step-brand-wrap-ankle-pair-unusual-sword-train" ์‚ฌ์šฉ . $ age -d secrets.txt.age > secrets.txt ์•”ํ˜ธ ์ž…๋ ฅ: $ age-keygen | age -p> key.age public Key : Age1yhm4gftwfmrpz87tdslm530wrx6m79ya9f2hdztjnehnehnehnehnehnehpqrjpyx0 ํŒจ์Šค ํ”„๋ ˆ์ด์ฆˆ๋ฅผ Enter acecure one์„ ์ž๋™ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋น„์›Œ ๋‘ก๋‹ˆ๋‹ค.

ํ–ฅํ›„ ๊ณ„ํš์—๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ ์ €์žฅ์„ ์œ„ํ•œ ๋ฐฑ์—”๋“œ ๋ฐ ๊ณต์œ  ํ‚ค์šฉ ์„œ๋ฒ„(PAKE) ์ƒ์„ฑ, YubiKey ํ‚ค ์ง€์›, ๋‹จ์–ด ์ง‘ํ•ฉ ํ˜•ํƒœ๋กœ ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด ํ‚ค ์ƒ์„ฑ ๊ธฐ๋Šฅ, FS์— ์•”ํ˜ธํ™”๋œ ํŒŒ์ผ์ด๋‚˜ ์•„์นด์ด๋ธŒ๋ฅผ ๋งˆ์šดํŠธํ•˜๊ธฐ ์œ„ํ•œ ์—์ด์ง€ ๋งˆ์šดํŠธ ์œ ํ‹ธ๋ฆฌํ‹ฐ์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€