๊ฐ๋ ฅํ๊ณ ์์ ํ Python์ ๋์นญ ์ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Fernet์ ์ดํด๋ณด์ธ์. ์ ์ญ ๋ฐ์ดํฐ ๋ณดํธ๋ฅผ ์ํ ์๋ฆฌ, ๊ตฌํ, ๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ์ ํ ์ฌํญ์ ์์๋ณด์ธ์.
Python ์ํธํ: Fernet ๋์นญ ์ํธํ ์ฌ์ธต ๋ถ์
์ค๋๋ ์ ๋์งํธ ํ๊ฒฝ์์ ๋ฐ์ดํฐ ๋ณด์์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ๋ฏผ๊ฐํ ๊ธ์ต ์ ๋ณด ๋ณดํธ๋ถํฐ ๊ฐ์ธ ํต์ ๋ณด์๊น์ง, ๊ฐ๋ ฅํ ์ํธํ ๋ฐฉ๋ฒ์ด ํ์์ ์ ๋๋ค. Python์ ํ๋ถํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํ๊ณ๋ฅผ ํตํด ์ํธํ ์๋ฃจ์ ์ ๊ตฌํํ๊ธฐ ์ํ ๋ค์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋๊ตฌ ์ค ํ๋์ด์ ์ด ๊ธฐ์ฌ์ ์ด์ ์ ์ฌ์ฉ ํธ์์ฑ๊ณผ ๋์ ๋ณด์์ ์ํด ์ค๊ณ๋ ๋์นญ ์ํธํ ๋ชจ๋์ธ Fernet์ ๋๋ค.
Fernet ์ํธํ๋ ๋ฌด์์ ๋๊น?
Fernet์ ๋์นญ(๋๋ ๋น๋ฐ ํค) ์ํธํ์ ํน์ ๊ตฌํ์ ๋๋ค. ์ฆ, ๋ฐ์ดํฐ๋ฅผ ์ํธํํ๊ณ ํด๋ ํ๋ ๋ฐ ๋์ผํ ํค๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. 128๋นํธ ํค๋ฅผ ์ฌ์ฉํ๋ CBC(Cipher Block Chaining) ๋ชจ๋์ AES(Advanced Encryption Standard)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋์์ผ๋ฉฐ ์ธ์ฆ์ ์ํด HMAC๋ ์ฌ์ฉํ๋ Fernet์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ๋ณดํธํ๋ ๊ฐ๋ ฅํ๊ณ ์์ ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ค๊ณ ์ฒ ํ์ ๋จ์์ฑ๊ณผ ๋ณด์์ ๊ฐ์กฐํ์ฌ ํ์ ์์ค์ ์ํธํ ๊ธฐ๋ณธ ์์์ ๋ณต์ก์ฑ์ ํ๊ณ ๋ค ํ์ ์์ด ๊ฐ๋จํ ์ํธํ ์๋ฃจ์ ์ด ํ์ํ ๊ฐ๋ฐ์์๊ฒ ํ์ํ ์ ํ์ ๋๋ค.
๊ด๋ฒ์ํ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ต์ ์ ์ ๊ณตํ๋ ๋ค๋ฅธ ์ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฌ๋ฆฌ Fernet์ ์๋์ ์ผ๋ก ๊ธฐ๋ฅ์ ๋จ์ผ์ ์ ๊ฒ์ฆ๋ ๊ตฌ์ฑ์ผ๋ก ์ ํํฉ๋๋ค. ์ด๋ฅผ ํตํด ์๋ชป๋ ๊ตฌ์ฑ์ ๊ฐ๋ฅ์ฑ์ ์ ํํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ๋์ ์์ค์ ๋ณด์์ ๋ณด์ฅํฉ๋๋ค.
Fernet์ ์ฃผ์ ๊ธฐ๋ฅ
- ๋์นญ ์ํธํ: ์ํธํ ๋ฐ ํด๋ ๋ชจ๋์ ๋์ผํ ํค๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์๋๋ฆฌ์ค์์ ํค ๊ด๋ฆฌ๋ฅผ ๊ฐ์ํํฉ๋๋ค.
- ์ธ์ฆ๋ ์ํธํ: ๋ฐ์ดํฐ์ ๊ธฐ๋ฐ์ฑ๊ณผ ๋ฌด๊ฒฐ์ฑ์ ๋ชจ๋ ๋ณด์ฅํ๊ธฐ ์ํด ์ํธํ์ ์ธ์ฆ์ ๊ฒฐํฉํฉ๋๋ค. ์ฆ, ๋ฐ์ดํฐ๊ฐ ์ํธํ๋ ๋ฟ๋ง ์๋๋ผ ๋ณ์กฐ๋ก๋ถํฐ ๋ณดํธ๋ฉ๋๋ค.
- ์๋ ํค ์ํ ์ง์: ํด๋ ์ ์ํด ์ฌ๋ฌ ์ ํจํ ํค๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ์ฌ ์ค์ํ ๋ณด์ ๊ดํ์ธ ํค ์ํ์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค.
- ์ฌ์ฉํ๊ธฐ ์ฌ์: ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ธ API๋ฅผ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์๊ฐ Python ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ํธํ๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
- ๊ฐ๋ ฅํ ๋ณด์: ์ ํ๋ฆฝ๋ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋์์ผ๋ฉฐ ์ผ๋ฐ์ ์ธ ๊ณต๊ฒฉ์ ์ ํญํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
Python์์ Fernet ์์ํ๊ธฐ
Fernet์ ์ฌ์ฉํ๊ธฐ ์ ์ ์ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค.
pip install cryptography
๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ค์น๋๋ฉด Fernet์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ๊ณ ํด๋ ํ ์ ์์ต๋๋ค.
Fernet ํค ์์ฑ
์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ Fernet ํค๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ์ด ํค๋ ๋น๋ฐ๋ก ์ ์งํ๊ณ ์์ ํ๊ฒ ๋ณด๊ดํด์ผ ํฉ๋๋ค. ํค๊ฐ ์์๋๋ฉด ์ ์ฒด ์ํธํ ์ฒด๊ณ๊ฐ ์์๋ฉ๋๋ค. ์ ๋ ํค๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ ํ๋ ์ฝ๋ฉํ์ง ๋ง์ญ์์ค. ํ๊ฒฝ ๋ณ์, ๋ณด์ ํค ๊ด๋ฆฌ ์์คํ ๋๋ ๊ธฐํ ๋ณด์ ์คํ ๋ฆฌ์ง ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ญ์์ค.
from cryptography.fernet import Fernet
key = Fernet.generate_key()
print(key) # Store this key securely!
์ด ์ฝ๋ ์กฐ๊ฐ์ ์ Fernet ํค๋ฅผ ์์ฑํ๊ณ ์ฝ์์ ์ถ๋ ฅํฉ๋๋ค. ์์ฑ๋ ํค๋ ๋ฐ์ดํธ ๊ฐ์ฒด์ ๋๋ค. ์ค์: ์ด ํค๋ฅผ ์์ ํ๊ฒ ๋ณด๊ดํ์ญ์์ค! ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ํค๋ฅผ ์ ์ฅํ๊ธฐ ์ ์ base64 ํ์์ผ๋ก ์ธ์ฝ๋ฉํ๋ ๊ฒ์ ๋๋ค.
๋ฐ์ดํฐ ์ํธํ
ํค๊ฐ ์์ผ๋ฉด ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ ์ ์์ต๋๋ค.
from cryptography.fernet import Fernet
# Load your key from a secure source
key = b'YOUR_KEY_HERE' # Replace with your actual key
f = Fernet(key)
message = b"This is a secret message!"
encrypted = f.encrypt(message)
print(encrypted)
์ด ์ฝ๋ ์กฐ๊ฐ์ Fernet ํค๋ฅผ ์ฌ์ฉํ์ฌ "This is a secret message!"๋ผ๋ ๋ฉ์์ง๋ฅผ ์ํธํํฉ๋๋ค. encrypt()
๋ฉ์๋๋ ์ํธํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํธ ๊ฐ์ฒด๋ก ๋ฐํํฉ๋๋ค.
๋ฐ์ดํฐ ํด๋
๋ฐ์ดํฐ๋ฅผ ํด๋
ํ๋ ค๋ฉด decrypt()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ญ์์ค.
from cryptography.fernet import Fernet
# Load your key from a secure source
key = b'YOUR_KEY_HERE' # Replace with your actual key
f = Fernet(key)
decrypted = f.decrypt(encrypted)
print(decrypted.decode())
์ด ์ฝ๋ ์กฐ๊ฐ์ ๋์ผํ Fernet ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ํธํ๋ ๋ฐ์ดํฐ๋ฅผ ํด๋
ํฉ๋๋ค. decrypt()
๋ฉ์๋๋ ์๋ ๋ฉ์์ง๋ฅผ ๋ฐ์ดํธ ๊ฐ์ฒด๋ก ๋ฐํํ๊ณ , ๊ทธ๋ฐ ๋ค์ ๋ฌธ์์ด๋ก ๋์ฝ๋ฉ๋ฉ๋๋ค.
Fernet ํค ์ํ
ํค ์ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ํธํ ํค๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ณ๊ฒฝํ๋ ์ค์ํ ๋ณด์ ๊ดํ์ ๋๋ค. ์ด๋ ํค ์์ ์ํ์ ์ํํ๊ณ ์ ์ฌ์ ์นจํด์ ์ํฅ์ ์ค์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
Fernet์ ์ ํจํ ํค ๋ชฉ๋ก์ ์ง์ ํ ์ ์๋๋ก ํ์ฌ ํค ์ํ์ ๋ํ ๊ธฐ๋ณธ ์ ๊ณต ์ง์์ ์ ๊ณตํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ํด๋ ํ ๋ Fernet์ ์ ํจํ ํค๋ฅผ ์ฐพ์ ๋๊น์ง ๋ชฉ๋ก์ ๊ฐ ํค๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ ์ ์๋ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ์ ๋ํ ์ก์ธ์ค๋ฅผ ์ค๋จํ์ง ์๊ณ ์ ํค๋ก ์ํํ๊ฒ ์ ํํ ์ ์์ต๋๋ค.
from cryptography.fernet import Fernet, MultiFernet
# Generate multiple keys
key1 = Fernet.generate_key()
key2 = Fernet.generate_key()
# Create Fernet objects for each key
f1 = Fernet(key1)
f2 = Fernet(key2)
# Create a MultiFernet object with both keys
multi_fernet = MultiFernet([f2, f1]) # Order matters! Newest key should be first
# Encrypt the data with the newest key
encrypted = f2.encrypt(b"This is a secret message!")
# Decrypt the data using the MultiFernet object
decrypted = multi_fernet.decrypt(encrypted)
print(decrypted.decode())
์ด ์์ ์์๋ key2
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ํธํํฉ๋๋ค. MultiFernet
๊ฐ์ฒด๋ ํค ๋ชฉ๋ก์ผ๋ก ์ด๊ธฐํ๋๋ฉฐ, ์ฌ๊ธฐ์ ๊ฐ์ฅ ์ต๊ทผ ํค(f2
)๊ฐ ๋จผ์ ๋์ด๋ฉ๋๋ค. ํด๋
ํ ๋ MultiFernet
์ ๋จผ์ f2
๋ก ํด๋
์ ์๋ํฉ๋๋ค. ์คํจํ๋ฉด(์: ๋ฐ์ดํฐ๊ฐ f1
๋ก ์ํธํ๋ ๊ฒฝ์ฐ) f1
์ ์๋ํฉ๋๋ค. `MultiFernet` ์์ฑ์์ ํค ์์๊ฐ ์ค์ํฉ๋๋ค. ํค๋ ์ต์ ํค๊ฐ ๋จผ์ ์ค๋๋ก ์์ฑ์ ์ญ์์ผ๋ก ๋์ดํด์ผ ํฉ๋๋ค.
Fernet ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
Fernet์ ๋น๊ต์ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด์ง๋ง ๋ฐ์ดํฐ ๋ณด์์ ๋ณด์ฅํ๋ ค๋ฉด ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ๋ณด์ ํค ์ ์ฅ์: Fernet ํค๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ ํ๋ ์ฝ๋ฉํ์ง ๋ง์ญ์์ค. ๋์ ํ๊ฒฝ ๋ณ์, ํค ๊ด๋ฆฌ ์์คํ ๋๋ ๊ธฐํ ๋ณด์ ์คํ ๋ฆฌ์ง ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ์์ ํ๊ฒ ์ ์ฅํ์ญ์์ค.
- ์ ๊ธฐ์ ์ธ ํค ์ํ: ํค ์์ ์ํ์ ์ํํ๊ธฐ ์ํด Fernet ํค๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ณ๊ฒฝํ๋ ํค ์ํ ์ ๋ต์ ๊ตฌํํ์ญ์์ค.
- ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ: ์๋ชป๋ ํค ์์ธ ๋๋ ์๋ชป๋ ํ ํฐ ์์ธ์ ๊ฐ์ด Fernet์์ ๋ฐ์ํ ์ ์๋ ์์ธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- ํค ๋ฒ์ ์ ํ: ๊ฐ ํค์ ๋ฒ์๋ฅผ ์ ํํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์๋ฅผ ๋ค์ด ์๋ก ๋ค๋ฅธ ์ ํ์ ๋ฐ์ดํฐ ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ก ๋ค๋ฅธ ๋ถ๋ถ์ ๋ํด ์๋ก ๋ค๋ฅธ ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ํค ์์์ ์ํฅ์ ์ ํํฉ๋๋ค.
- ์์ธก ๊ฐ๋ฅํ ๋ฐ์ดํฐ ๋ฐฉ์ง: ๋์ผํ ์์ธก ๊ฐ๋ฅํ ๋ฐ์ดํฐ๋ฅผ ๋์ผํ ํค๋ก ์ฌ๋ฌ ๋ฒ ์ํธํํ๋ฉด ๊ณต๊ฒฉ์์๊ฒ ์ ๋ณด๊ฐ ๋ ธ์ถ๋ ์ ์์ต๋๋ค. ์์ธก ๊ฐ๋ฅํ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ ๋ ์์์ฑ์ ์ถ๊ฐํ๊ฑฐ๋ ์ํธ ๊ธฐ์ ์ ์ฌ์ฉํ์ญ์์ค.
- HTTPS์ ํจ๊ป ์ฌ์ฉ: ๋คํธ์ํฌ๋ฅผ ํตํด ์ํธํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋๋ ํญ์ HTTPS๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ก ์ค์ธ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ์ญ์์ค.
- ๋ฐ์ดํฐ ์์ฃผ ๊ณ ๋ ค: ์ํธํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ์ฒ๋ฆฌํ ๋ ์ฌ๋ฌ ๊ตญ๊ฐ์ ๋ฐ์ดํฐ ์์ฃผ ์๊ตฌ ์ฌํญ ๋ฐ ๊ท์ ์ ์ผ๋์ ๋์ญ์์ค. ์๋ฅผ ๋ค์ด ์ ๋ฝ ์ฐํฉ์ ์ผ๋ฐ ๋ฐ์ดํฐ ๋ณดํธ ๊ท์ (GDPR)์ ์ํธํ๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๋ํ ์๊ฒฉํ ์๊ตฌ ์ฌํญ์ ์ ์ฉํฉ๋๋ค. ์ ์ธ๊ณ์ ์ผ๋ก ์ด์๋๋ ํ์ฌ๋ ์ด๋ฌํ ๊ท์ ์ ์ดํดํ๊ณ ์ค์ํด์ผ ํฉ๋๋ค.
Fernet์ ์ ํ ์ฌํญ
Fernet์ ๊ฐ๋ ฅํ๊ณ ํธ๋ฆฌํ ์ํธํ ๋๊ตฌ์ด์ง๋ง ์ ํ ์ฌํญ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ๋์นญ ์ํธํ: Fernet์ ๋์นญ ์ํธํ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฆ, ์ํธํ ๋ฐ ํด๋ ์ ๋์ผํ ํค๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ํนํ ๋ถ์ฐ ์์คํ ์์ ํค ๊ด๋ฆฌ๊ฐ ๋ ์ด๋ ค์์ง ์ ์์ต๋๋ค. ์๋ก ๋ค๋ฅธ ๋น์ฌ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ๊ณ ํด๋ ํด์ผ ํ๋ ์๋๋ฆฌ์ค์์๋ ๋น๋์นญ ์ํธํ(์: RSA ๋๋ ECC ์ฌ์ฉ)๊ฐ ๋ ์ ํฉํ ์ ์์ต๋๋ค.
- ํค ๋ฐฐํฌ: Fernet์ ๋ณด์์ ์ ์ ์ผ๋ก ํค์ ๋น๋ฐ์ ๋ฌ๋ ค ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฅผ ํด๋ ํด์ผ ํ๋ ๋ชจ๋ ๋น์ฌ์์๊ฒ ํค๋ฅผ ์์ ํ๊ฒ ๋ฐฐํฌํ๋ ๊ฒ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. Diffie-Hellman๊ณผ ๊ฐ์ ํค ๊ตํ ํ๋กํ ์ฝ ๋๋ ํค ๊ด๋ฆฌ ์์คํ ์ ์ฌ์ฉํ์ฌ ํค๋ฅผ ์์ ํ๊ฒ ๋ฐฐํฌํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ๋จ์ผ ์๊ณ ๋ฆฌ์ฆ: Fernet์ AES-CBC์ HMAC-SHA256์ ํน์ ์กฐํฉ์ ์ฌ์ฉํฉ๋๋ค. ์ด ์กฐํฉ์ ์์ ํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์ง๋ง ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํ์ง ์์ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ ๋๋ ๊ตฌ์ฑ์ด ํ์ํ ๊ฒฝ์ฐ ํ์ ์์ค์ ์ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํ ์ ์์ต๋๋ค.
- ๊ธฐ๋ณธ ์ ๊ณต ID ๊ด๋ฆฌ ์์: Fernet์ ์ํธํ๋ง ์ฒ๋ฆฌํฉ๋๋ค. ID ๊ด๋ฆฌ ๋๋ ์ก์ธ์ค ์ ์ด๋ฅผ ์ํ ๊ธฐ๋ณธ ์ ๊ณต ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ ๋ณ๋๋ก ๊ตฌํํด์ผ ํฉ๋๋ค.
- ๋์ฉ๋ ํ์ผ์ ์ ํฉํ์ง ์์: Fernet์ ๋์ฉ๋ ํ์ผ์ ์ฒ๋ฆฌํ ์ ์์ง๋ง ๋ฉ๋ชจ๋ฆฌ์์ ๋งค์ฐ ํฐ ํ์ผ์ ์ํธํํ๋ ๊ฒ์ ๋ฆฌ์์ค ์ง์ฝ์ ์ผ ์ ์์ต๋๋ค. ๋งค์ฐ ํฐ ํ์ผ์ ๊ฒฝ์ฐ ์คํธ๋ฆฌ๋ฐ ์ํธํ ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
Fernet์ ๋ํ ๋์
Fernet์ ๋ง์ ์ฌ์ฉ ์ฌ๋ก์ ์ ํฉํ์ง๋ง ๋ค๋ฅธ Python ์ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ฉฐ ๊ฐ๊ฐ ๊ณ ์ ํ ๊ฐ์ ๊ณผ ์ฝ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- PyCryptodome: ๊ด๋ฒ์ํ ์ํธํ ์๊ณ ๋ฆฌ์ฆ, ํด์ ํจ์ ๋ฐ ๊ธฐํ ์ํธํ ๊ธฐ๋ณธ ์์๋ฅผ ์ ๊ณตํ๋ ๋ณด๋ค ํฌ๊ด์ ์ธ ์ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ํธํ ํ๋ก์ธ์ค์ ๋ํ ๋ ๋ง์ ์ ์ฐ์ฑ๊ณผ ์ ์ด๊ฐ ํ์ํ ๊ฒฝ์ฐ PyCryptodome์ด ์ข์ ์ ํ์ ๋๋ค.
- Cryptography.io(Fernet์ ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ): ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ์ ์์ค์ ์ํธํ ๊ธฐ๋ณธ ์์๋ฅผ ์ ๊ณตํ๋ฉฐ Fernet์์ ์ฌ์ฉ๋ฉ๋๋ค. ์ฌ์ฉ์ ์ง์ ์ํธํ ์ฒด๊ณ๋ฅผ ๊ตฌํํ๊ฑฐ๋ ํน์ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์์ ํด์ผ ํ๋ ๊ฒฝ์ฐ cryptography.io๊ฐ ๊ฐ๋ ฅํ ์ ํ์ ๋๋ค.
- GPG(GNU Privacy Guard): ๊ณต๊ฐ ํค ์ํธํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ๊ณ ์๋ช ํ๊ธฐ ์ํ ๋ช ๋ น์ค ๋๊ตฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. GPG๋ ์ข ์ข ์ด๋ฉ์ผ ๋ฐ ๊ธฐํ ๋ฏผ๊ฐํ ํต์ ์ ์ํธํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ํด์ฑ ์๊ณ ๋ฆฌ์ฆ(์: SHA-256, bcrypt): ์ํธํ๋ ์๋์ง๋ง ํด์ฑ์ ์ํธ ์ ์ฅ ๋ฐ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฌ์ ํ์์ ์ ๋๋ค. hashlib์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์ํ ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ์ ์ ๊ณตํฉ๋๋ค.
- ๋น๋์นญ ์ํธํ(์: RSA, ECC): ํค ๊ตํ ๋ฐ ๋์งํธ ์๋ช ์ ์ฌ์ฉ๋ฉ๋๋ค. ๋น์ฌ์๊ฐ ๋น๋ฐ ํค๋ฅผ ๊ณต์ ํ์ง ์์ ๋ ์ ์ฉํฉ๋๋ค. cryptography.io์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋ฌํ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ์ ์ ๊ณตํฉ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ๋ฐฉ๋ฒ์ ๊ฐ์ฅ ์ข์ ์ ํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
Fernet ์ฌ์ฉ ์ฌ๋ก
Fernet์ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ์ฌ์ฉ ์ฌ๋ก์ ์ ํฉํฉ๋๋ค.
- ๊ตฌ์ฑ ํ์ผ ์ํธํ: API ํค, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํธ ๋ฐ ๊ธฐํ ์๊ฒฉ ์ฆ๋ช ๊ณผ ๊ฐ์ ๊ตฌ์ฑ ํ์ผ์ ์ ์ฅ๋ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ๋ณดํธํฉ๋๋ค.
- ๋ฏธ์ฌ์ฉ ๋ฐ์ดํฐ ๋ณด์: ๋์คํฌ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ์ฌ ๋ฌด๋จ ์ก์ธ์ค๋ก๋ถํฐ ๋ณดํธํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๊ธ์ต ๊ธฐ๊ด์ Fernet์ ์ฌ์ฉํ์ฌ ๋ ์ผ ํ๋ํฌํธ๋ฅดํธ์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๊ณ ๊ฐ ๊ณ์ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ์ฌ ํ์ง ๋ฐ์ดํฐ ๋ณดํธ ๊ท์ ์ ์ค์ํ ์ ์์ต๋๋ค.
- ์๋น์ค ๊ฐ ํต์ ๋ณดํธ: ๋์ฒญ ๋ฐ ๋ณ์กฐ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ์ ํต์ ์ ์ํธํํฉ๋๋ค. ์ฌ๋ฌ ์ง๋ฆฌ์ ์ง์ญ์ ๊ฑธ์ณ ๋ถ์ฐ๋ ์์คํ ์ ์๋น์ค ๊ฐ์ ๊ตํ๋๋ ๋ฉ์์ง๋ฅผ ์ํธํํ๊ธฐ ์ํด Fernet์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ฌ ๊ตญ์ ๊ตญ๊ฒฝ์ ๋์ด ๋ฐ์ดํฐ ๊ธฐ๋ฐ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- ์ฟ ํค ๋๋ ์ธ์ ์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ ์ ์ฅ: ์ ์ฑ ์ฌ์ฉ์๊ฐ ๊ฐ๋ก์ฑ๊ฑฐ๋ ๋ณ์กฐํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฟ ํค ๋๋ ์ธ์ ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ํธํํฉ๋๋ค. ๋์ฟ์ ์ ์ ์๊ฑฐ๋ ํ๋ซํผ์ Fernet์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ์ฌ ๊ณ ๊ฐ์ ๊ฐ์ธ ์ ๋ณด์ ์ผํ ์นดํธ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ณดํธํ ์ ์์ต๋๋ค.
- ๋ณด์ ๋ฉ์์ง ์ ํ๋ฆฌ์ผ์ด์ : ์ฌ์ฉ์ ํต์ ์ ๊ฐ์ธ ์ ๋ณด๋ฅผ ๋ณดํธํ๊ธฐ ์ํด ๋ฉ์์ง ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ข ๋จ ๊ฐ ์ํธํ๋ฅผ ๊ตฌํํฉ๋๋ค. ์ค์์ค์์ ๊ฐ๋ฐ๋ ๋ณด์ ๋ฉ์์ง ์ฑ์ Fernet์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ๊ฐ์ ๋ฉ์์ง๋ฅผ ์ํธํํ์ฌ ์ค์์ค ๋ฐ์ดํฐ ๋ณดํธ๋ฒ์ ๋ฐ๋ผ ๊ฐ์ธ ์ ๋ณด๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค.
์์ : ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฌธ์์ด ์ํธํ
Fernet์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฌธ์์ด์ ์ํธํํ๋ ์ค์ฉ์ ์ธ ์์ ๋ฅผ ๋ณด์ฌ ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฏผ๊ฐํ ์๊ฒฉ ์ฆ๋ช ์ด ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ฑ์ ์ผ๋ฐ ํ ์คํธ๋ก ์ ์ฅ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
import os
from cryptography.fernet import Fernet
# Function to encrypt data
def encrypt_data(data: str, key: bytes) -> bytes:
f = Fernet(key)
return f.encrypt(data.encode())
# Function to decrypt data
def decrypt_data(encrypted_data: bytes, key: bytes) -> str:
f = Fernet(key)
return f.decrypt(encrypted_data).decode()
# Example Usage:
# 1. Generate a key (only do this once and store securely!)
# key = Fernet.generate_key()
# print(key)
# 2. Load the key from an environment variable (recommended)
key = os.environ.get("DB_ENCRYPTION_KEY") # e.g., export DB_ENCRYPTION_KEY=YOUR_KEY_HERE
if key is None:
print("Error: DB_ENCRYPTION_KEY environment variable not set!")
exit(1)
key = key.encode()
# 3. Database connection string (replace with your actual string)
db_connection_string = "postgresql://user:password@host:port/database"
# 4. Encrypt the connection string
encrypted_connection_string = encrypt_data(db_connection_string, key)
print(f"Encrypted Connection String: {encrypted_connection_string}")
# 5. Store the encrypted connection string (e.g., in a file or database)
# In a real application, you'd store this somewhere persistent.
# Later, when you need to connect to the database:
# 6. Retrieve the encrypted connection string from storage.
# Let's pretend we retrieved it.
retrieved_encrypted_connection_string = encrypted_connection_string
# 7. Decrypt the connection string
decrypted_connection_string = decrypt_data(retrieved_encrypted_connection_string, key)
print(f"Decrypted Connection String: {decrypted_connection_string}")
# 8. Use the decrypted connection string to connect to the database.
# import psycopg2 # Example using psycopg2 for PostgreSQL
# conn = psycopg2.connect(decrypted_connection_string)
# ... your database operations ...
# conn.close()
์ค์ ๊ณ ๋ ค ์ฌํญ:
- ํค ๊ด๋ฆฌ: ์ด ์์ ์ ๊ฐ์ฅ ์ค์ํ ์ธก๋ฉด์ ๋ณด์ ํค ๊ด๋ฆฌ์ ๋๋ค. ํค๋ฅผ ํ๋ ์ฝ๋ฉํ์ง ๋ง์ญ์์ค. ํ๊ฒฝ ๋ณ์, HashiCorp Vault์ ๊ฐ์ ์ ์ฉ ํค ๊ด๋ฆฌ ์์คํ (KMS) ๋๋ ํด๋ผ์ฐ๋ ๊ณต๊ธ์์ KMS ์๋น์ค(์: AWS KMS, Azure Key Vault, Google Cloud KMS)๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- ์ธ์ฝ๋ฉ: ํนํ ์ํธํ ๋ฐ ํด๋
์ ๋ฐ์ดํธ์ ๋ฌธ์์ด์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ณ ์๋์ง ํ์ธํ์ญ์์ค.
.encode()
๋ฐ.decode()
๋ฉ์๋๋ ๋ฌธ์์ด๊ณผ ๋ฐ์ดํธ ๊ฐ์ ๋ณํ์ ์ค์ํฉ๋๋ค. - ์ค๋ฅ ์ฒ๋ฆฌ: ์๋ชป๋ ํค ๋๋ ํด๋ ์คํจ์ ๊ฐ์ ์์ธ๋ฅผ catchํ๊ธฐ ์ํด ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ์ญ์์ค.
๊ฒฐ๋ก
Fernet์ Python ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋์นญ ์ํธํ๋ฅผ ๊ตฌํํ๋ ๊ฐ๋จํ๊ณ ์์ ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ฌ์ฉ ์ฉ์ด์ฑ๊ณผ ๊ฐ๋ ฅํ ๋ณด์ ๊ธฐ๋ฅ์ด ๊ฒฐํฉ๋์ด ๋ค์ํ ์๋๋ฆฌ์ค์์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๋ ๋ฐ ์ ์ฉํ ๋๊ตฌ์ ๋๋ค. ํค ๊ด๋ฆฌ ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด Fernet์ ํ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์์ ๊ฐํํ๊ณ ๋ฌด๋จ ์ก์ธ์ค๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ ์ ์์ต๋๋ค. ํญ์ ์์ ํ ํค ์ ์ฅ ๋ฐ ์ํ์ ์ฐ์ ์ํ๊ณ ํน์ ์ฌ์ฉ ์ฌ๋ก์ Fernet์ ์ ํํ ๋ ๋์นญ ์ํธํ์ ์ ํ ์ฌํญ์ ๊ณ ๋ คํ์ญ์์ค.
์ํ ํ๊ฒฝ์ด ๊ณ์ ์งํํจ์ ๋ฐ๋ผ ์ต์ ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ์ํธํ ๊ธฐ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์งํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค. Fernet๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ๋ณด์ ๋ฌด๊ธฐ๊ณ ์ ํตํฉํ๋ฉด ์ ์ ๋ ์ํธ ์ฐ๊ฒฐ๋๋ ์ธ์์์ ๋ฐ์ดํฐ์ ๊ธฐ๋ฐ์ฑ๊ณผ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ์์ฃผ ๋ฒ๋ฅ ์ ์ดํดํ๊ณ ์ ์ ํ ๊ธฐ์ ์ ์ ์ฉํ๋ฉด ์ ์ธ๊ณ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ ์ ์์ต๋๋ค.