Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python Fernet 모듈로 데이터 암호화·복호화하는 방법

서론

암호학(Cryptography)이란 무엇일까요? 암호학은 평문(plain text)을 알아볼 수 없는 암호문(cipher text)으로 바꾸는 '암호화'와, 암호문을 다시 읽을 수 있는 평문으로 되돌리는 '복호화'를 다루는 기술입니다.

이 글에서는 Python의 cryptography 패키지에 포함된 fernet 모듈을 사용해 데이터를 암호화하고 복호화하는 방법을 알아봅니다. fernet 모듈을 사용하면 고유한 키가 자동으로 생성되며, 이 키가 없으면 암호화된 데이터를 읽거나 조작할 수 없습니다.

그럼 지금부터 본격적으로 시작해 보겠습니다.

시작하기

cryptography 모듈은 Python에 기본으로 포함되어 있지 않기 때문에 pip 패키지 관리자를 통해 직접 설치해야 합니다. 터미널을 열고 아래 명령어를 입력하세요.

pip install cryptography

패키지 설치가 완료되면 필요한 모듈을 임포트할 수 있습니다.

이번 튜토리얼에서는 데이터를 암호화하고 복호화하는 데 fernet 모듈을 사용합니다. 파이썬 스크립트에 아래와 같이 임포트하세요.

from cryptography.fernet import Fernet

참고 − 모듈 이름의 대소문자 구분에 주의하세요.

이제 스크립트 작성 준비가 끝났습니다.

키 생성하기

데이터를 암호화하려면 먼저 fernet 키를 만들어야 합니다.

key = Fernet.generate_key()
f = Fernet(key)

위 코드에서는 generate_key() 메서드로 키를 생성한 뒤, 그 키를 변수 "f"에 할당했습니다.

이제 키가 변수에 저장되었으므로 바로 사용할 수 있습니다.

필요하다면 키를 출력해서 따로 보관해 둘 수도 있습니다. 출력할 때는 반드시 decode 함수를 사용하세요.

print(key.decode())

출력 결과

Bq64GE−−93K1RVro4go1frN−8twBSvXdbCPSPLIKz9U=

데이터 암호화하기

생성한 키로 데이터를 암호화하려면 encrypt 메서드를 사용합니다.

encrypted_data = f.encrypt(b"This message is being encrypted and cannot be seen!")

이것으로 문장이 암호화되었습니다.

암호화된 메시지를 확인하려면 print로 출력하면 됩니다.

print(encrypted_data)

출력 결과

b'gAAAAABgILy91p_wqMntdT3mDkh0IBXSLjuBMQAfnGZAFkZCX1U6Q7TU2PthgFBwVz0QbKXpuNTHRzAgbdDV4zfuuzkGCXqVD--xJdkTycKH2iurC_oqHySLc9xJEXz93LkhTbKUa5HCxfJtB-Um_YkxqjclftXXZQ=='

참고 − 문자열 앞에 b를 붙인 이유는 해당 문장을 바이트(byte) 형식으로 변환하기 위함입니다. 대신 encode() 메서드를 사용해도 됩니다.

데이터 복호화하기

이제 암호문을 다시 사람이 읽을 수 있는 평문으로 되돌려 보겠습니다.

복호화는 fernet 모듈의 decrypt 메서드로 간단히 처리할 수 있습니다.

decrypted_data = f.decrypt(encrypted_data) # f는 키 값을 담고 있는 변수입니다.
print(decrypted_data)

출력 결과

b'This message is being encrypted and cannot be seen!'

참고 − 출력된 평문 앞에 b'가 붙어 있는 이유는 복호화된 데이터가 여전히 바이트 형식이기 때문입니다. 순수한 텍스트만 얻으려면 decode 함수를 사용해야 합니다.

print(decrypted_data.decode())

출력 결과

This message is being encrypted and cannot be seen!

참고 − 같은 키로 암호화와 복호화를 모두 수행할 수 있습니다. 즉, 키 값을 출력해 저장해 두면 나중에 변수에 할당하여 동일한 키를 재사용할 수 있습니다. 예시는 다음과 같습니다.

f = Fernet(b"Bq64GE--93K1RVro4go1frN-8twBSvXdbCPSPLIKz9U=") # 실제 키 값

전체 예제

지금까지 배운 내용을 하나의 스크립트로 정리하면 다음과 같습니다.

from cryptography.fernet import Fernet
key = Fernet.generate_key()
print("Key : ", key.decode())
f = Fernet(key)
encrypted_data = f.encrypt(b"This message is being encrypted and cannot be seen!")
print("After encryption : ", encrypted_data)
decrypted_data = f.decrypt(encrypted_data)
print(decrypted_data)
print("After decryption : ", decrypted_data.decode())

출력 결과

Key : u4dM7xw8sNNU3Rm_lwDbixudWSeaM0Z4TTDdQNKsouI=
After encryption : b'gAAAAABgIL3_qbfM_oMgQn653gpk6a7hqxXiR0dl0vrmOmqnr5b6MqrsjGkK1IknxMLLtOCq6_YlX4x3nBedbZqtCqy4os55pttrl-pBO6-dJf6kVP50IpIaKSXbpAsuWl4h_2o_E-4YEqZ5kkgxWrwnqojmkMyuSQ=='
b'This message is being encrypted and cannot be seen!'
After decryption : This message is being encrypted and cannot be seen!

마무리

이제 Python의 cryptography 패키지를 사용해 데이터를 암호화하고 복호화하는 방법을 배웠습니다.

키를 .txt 파일로 저장해 두었다가 불러와서 비밀번호를 암호화해 저장하거나, 데이터베이스에 저장된 비밀번호를 복호화해 일치 여부를 검증하는 용도로도 활용할 수 있습니다. 소규모 미니 프로젝트부터 대규모 프로젝트까지 다양한 상황에서 유용하게 쓸 수 있으니 꼭 실습해 보시길 권합니다.

cryptography 모듈에 대한 더 자세한 내용은 공식 문서( https://pypi.org/project/cryptography/ )를 참고하세요.